{"id":2130,"date":"2016-01-25T13:30:01","date_gmt":"2016-01-25T13:30:01","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2130"},"modified":"2025-06-13T17:33:08","modified_gmt":"2025-06-14T00:33:08","slug":"moving-sql-database-content-to-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/moving-sql-database-content-to-couchbase\/","title":{"rendered":"Trasladar el contenido de una base de datos SQL a Couchbase"},"content":{"rendered":"<p>Desde el lanzamiento GA de N1QL, recibimos muchas preguntas sobre c\u00f3mo mover contenido de una base de datos SQL a Couchbase. Hay muchas maneras diferentes de hacerlo. Hoy he elegido la que probablemente sea la m\u00e1s sencilla. Transformar\u00e9 cada fila de cada tabla en un JsonDocument y lo almacenar\u00e9 en Couchbase. Har\u00e9 mi prueba con Postgres y su <a href=\"https:\/\/www.postgresqltutorial.com\/postgresql-sample-database\/\">conjunto de datos de muestra<\/a> inspirado en MySQL <a href=\"https:\/\/dev.mysql.com\/doc\/sakila\/en\/\">Muestra Sakila<\/a>. Utilizar\u00e9 Java, pero las directrices que aqu\u00ed se presentan son aplicables a otros lenguajes.<\/p>\n<h2>Conexi\u00f3n a una base de datos SQL en ejecuci\u00f3n<\/h2>\n<p>Como estoy usando Java, implementar\u00e9 Spring Boot y su paquete JDBC, que maneja la conexi\u00f3n db por m\u00ed. Todo lo que tengo que hacer es establecer las dependencias y propiedades correctas para configurar el paquete <a href=\"https:\/\/docs.spring.io\/spring\/docs\/current\/javadoc-api\/org\/springframework\/jdbc\/core\/JdbcTemplate.html\">JdbcTemplate<\/a>. Este objeto facilita la ejecuci\u00f3n de consultas SQL.<\/p>\n<h3>Dependencias<\/h3>\n<p>Para asegurarte de que tienes todo configurado de forma ordenada y autom\u00e1tica necesitas las siguientes dependencias:<\/p>\n<pre>\n<code>\n        dependencies {\n            compile \"org.springframework.boot:spring-boot-starter\",\n                    \"org.springframework.boot:spring-boot-starter-data-jpa\",\n                    \"org.postgresql:postgresql:9.4-1206-jdbc4\"\n        }\n<\/code><\/pre>\n<p>Estoy probando con Postgres pero se podr\u00eda a\u00f1adir cualquier otro driver soportado por Spring JDBC. El spring-boot-starter-data-jpa me permitir\u00e1 inyectar el JdbcTemplate preconfigurado.<\/p>\n<h3>Configuraci\u00f3n<\/h3>\n<p>Para asegurarse de que el framework Spring encuentra su base de datos, a\u00f1ada las siguientes propiedades a su archivo de configuraci\u00f3n (por ejemplo, src\/main\/resources\/application.properties).<\/p>\n<pre>\n<code>\n        spring.jpa.database=POSTGRESQL\n        spring.datasource.platform=postgres\n        spring.jpa.show-sql=true\n        spring.jpa.hibernate.ddl-auto=create-drop\n        spring.database.driverClassName=org.postgresql.Driver\n        spring.datasource.url=jdbc:postgresql:\/\/192.168.99.100:5432\/dvdrental\n        spring.datasource.username=postgres\n        spring.datasource.password=password\n<\/code><\/pre>\n<p>Por supuesto, usted tendr\u00e1 que ajustar esto de acuerdo a la base de datos que est\u00e1 utilizando. Aqu\u00ed estoy usando Postgres corriendo en 192.168.99.100 con el puerto por defecto 5432. El nombre de la base de datos que quiero usar es dvdrental.<\/p>\n<h3>C\u00f3digo<\/h3>\n<p>Si todo est\u00e1 configurado correctamente deber\u00edas poder inyectar el JdbcTemplate y empezar a consultar tu BD SQL.<\/p>\n<pre>\n<code>\n     @Autowired\n     JdbcTemplate jdbcTemplate;\n\n     @Override\n     public void doStuff() throws Exception {\n      String sql = \"SELECT id FROM table\";\n         Long id = jdbcTemplate.queryForObject(sql, Long.class);\n     }\n<\/code><\/pre>\n<h2>Conexi\u00f3n a Couchbase<\/h2>\n<p>Mi objetivo es mover el contenido de una base de datos SQL a Couchbase, por lo que tambi\u00e9n necesitamos una conexi\u00f3n Couchbase.<\/p>\n<h3>Dependencias<\/h3>\n<p>Trabajar con Couchbase en tu proyecto Java requiere que a\u00f1adas la siguiente dependencia:<\/p>\n<pre>\n<code>\n   dependencies {\n        compile \"com.couchbase.client:java-client:2.2.3\"\n    }\n<\/code><\/pre>\n<p>Esto le dar\u00e1 acceso a Couchbase<a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.1\/sdks\/java-2.2\/java-intro.html\"> SDK de Java<\/a>.<\/p>\n<h3>Configuraci\u00f3n<\/h3>\n<p>Una configuraci\u00f3n b\u00e1sica de Couchbase requiere b\u00e1sicamente tres propiedades: una direcci\u00f3n IP del servidor, un nombre de bucket y una contrase\u00f1a de bucket. Hacer esto de una manera Spring Boot se ver\u00eda as\u00ed:<\/p>\n<pre>\n<code>\n        @Configuration\n        public class Database {\n\n            @Value(\"${hostname}\")\n            private String hostname;\n\n            @Value(\"${bucket}\")\n            private String bucket;\n\n            @Value(\"${password}\")\n            private String password;\n\n            public @Bean Cluster cluster() {\n                return CouchbaseCluster.create(hostname);\n            }\n\n            public @Bean Bucket bucket() {\n                return cluster().openBucket(bucket, password);\n            }\n\n        }\n<\/code><\/pre>\n<p>Las propiedades hostname, bucket y password pueden a\u00f1adirse directamente al archivo de propiedades de tu aplicaci\u00f3n.<\/p>\n<pre>\n<code>\n   # Hostnames, comma separated list of Couchbase node IP or hostname\n    hostnames: localhost,127.0.0.1\n    # Bucket name\n    bucket: default\n    # Bucket password\n    password:\n<\/code><\/pre>\n<h3>C\u00f3digo<\/h3>\n<p>Con Couchbase, el nivel de granularidad equivalente a una base de datos ser\u00eda un bucket, que es donde almacenas los documentos. Con la configuraci\u00f3n anterior puedes simplemente inyectar un bucket y empezar a jugar.<\/p>\n<pre>\n<code>\n        @Autowired\n        Bucket bucket;\n\n        @Override\n        public void doStuff() throws Exception {\n            JsonDocument doc = bucket.get(\"key\");\n        }\n<\/code><\/pre>\n<h2>Tablas<\/h2>\n<p>En este punto tienes una conexi\u00f3n a una base de datos SQL y a Couchbase. Ahora podemos empezar a mover cosas. La forma m\u00e1s f\u00e1cil de mover datos es considerar cada fila de cada tabla como un documento.<\/p>\n<h3>Obtenci\u00f3n del esquema SQL<\/h3>\n<p>Empecemos por obtener el esquema de la base de datos autom\u00e1ticamente usando el JdbcTemplate. El objeto interesante aqu\u00ed es <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/sql\/DatabaseMetaData.html\">DatabaseMetaData<\/a>que puede darnos la estructura completa de la base de datos. La API no es la m\u00e1s f\u00e1cil de usar, pero al menos est\u00e1 documentada.<\/p>\n<p>Voy a mapear el resultado de la consulta DatabaseMetaData a una lista de Tabla y Columna. Para ello he creado la siguiente clase Java:<\/p>\n<pre>\n<code>\n         public class Table {\n\n            private String name;\n\n            private List<Column> columns = new ArrayList<Column>();\n\n            private String primaryKey;\n\n            public Table(String tableName) {\n             this.name = tableName;\n            }\n\n            public void setPrimaryKey(String primaryKey) {\n             this.primaryKey = primaryKey;\n            }\n\n            public void addColumn(String name, int type) {\n             columns.add(new Column(name, type));\n            }\n\n            public String getName() {\n             return name;\n            }\n\n            public List<Column> getColumns() {\n             return columns;\n            }\n\n            public String getPrimaryKey() {\n             return primaryKey;\n            }\n\n            public JsonObject toJsonObject() {\n             JsonObject obj = JsonObject.create();\n             JsonArray jsonColumns = JsonArray.create();\n             for (Column col : columns) {\n                    jsonColumns.add(col.toJsonObject());\n             }\n             obj.put(\"tableName\", name);\n             obj.put(\"primaryKey\", primaryKey);\n             obj.put(\"columns\", jsonColumns);\n             return obj;\n            }\n     }\n\n     public class Column {\n\n            private String name;\n\n            private int type;\n\n            public Column(String name, int type) {\n             this.name = name;\n             this.type = type;\n            }\n\n            public String getName() {\n             return name;\n            }\n\n            public int getType() {\n             return type;\n            }\n\n            public JsonObject toJsonObject() {\n             JsonObject obj = JsonObject.create();\n             obj.put(\"name\", name);\n             obj.put(\"type\", type);\n             return obj;\n            }\n\n     }       \n            \n<\/code><\/pre>\n<p>Definitivamente no es el c\u00f3digo m\u00e1s emocionante de escribir, pero al final obtienes una representaci\u00f3n JSON de las tablas de tu base de datos SQL.<\/p>\n<pre>\n<code>\n        public void getDatabaseSchema() throws Exception {\n         \/\/ get Database Medatadata objects to retrieve Tables schema\n        DatabaseMetaData databaseMetadata = jdbcTemplate.getDataSource().getConnection().getMetaData();\n            List<String> tableNames = new ArrayList<String>();\n            \/\/ Get tables names\n            ResultSet result = databaseMetadata.getTables(catalog, schemaPattern, tableNamePattern, types);\n            while (result.next()) {\n             String tablename = result.getString(3);\n             String tableType = result.getString(4);\n             \/\/ make sure we only import table(as oppose to Views, counter etc...)\n             if (!tablename.isEmpty() && \"TABLE\".equals(tableType)) {\n                    tableNames.add(tablename);\n                    log.debug(\"Will import table \" + tablename);\n             }\n            }\n            \/\/ Map the tables schema to Table objects\n            Map<String, Table> tables = new HashMap<String, Table>();\n            JsonObject tablesSchema = JsonObject.create();\n            for (String tableName : tableNames) {\n             result = databaseMetadata.getColumns(catalog, schemaPattern, tableName, columnNamePattern);\n             Table table = new Table(tableName);\n             while (result.next()) {\n                    String columnName = result.getString(4);\n                    \/\/ Maps to JDBCType enum\n                    int columnType = result.getInt(5);\n                    table.addColumn(columnName, columnType);\n             }\n             result = databaseMetadata.getPrimaryKeys(catalog, schemaPattern, tableName);\n             while (result.next()) {\n                    String columnName = result.getString(4);\n                    table.setPrimaryKey(columnName);\n             }\n             tables.put(tableName, table);\n             tablesSchema.put(tableName, table.toJsonObject());\n            }\n            JsonDocument schemaDoc = JsonDocument.create(tablesSchemaId, tablesSchema);\n            JsonDocument doc = bucket.upsert(schemaDoc);\n         }\n<\/code><\/pre>\n<h3>Contenido<\/h3>\n<p>Aqu\u00ed est\u00e1 la parte divertida. Aqu\u00ed es donde empezamos a mapear una fila de tabla a un JsonDocument. La secci\u00f3n anterior nos pone en un estado en el que podemos recuperar el nombre de todas las tablas. A partir de un nombre de tabla, podemos crear una consulta SQL que devuelva todas las filas de la tabla.<\/p>\n<p>Spring dispone de un mecanismo que permite definir un RowMapper. Para cada fila devuelta por la consulta, puedes devolver el objeto que quieras. Como estoy usando Couchbase, quiero un <a href=\"https:\/\/docs.couchbase.com\/sdk-api\/couchbase-java-client-2.2.0\/com\/couchbase\/client\/java\/document\/JsonDocument.html\">JsonDocument<\/a>.<\/p>\n<p>A continuaci\u00f3n se muestra un ejemplo de implementaci\u00f3n. Este RowMapper necesita un objeto Table previamente definido; por lo tanto, tenemos que implementar el m\u00e9todo mapRow. Hay varias cosas que tenemos que hacer aqu\u00ed.<\/p>\n<p>La primera tarea es crear una clave \u00fanica. Como las filas se clasifican por tablas, algunos identificadores pueden ser exactamente los mismos para filas de diferentes tablas. Pero los documentos se clasifican por bucket, por lo que necesitamos crear una clave de documento \u00fanica que refleje el id de la fila y el nombre de la tabla. Para no perder de vista la procedencia del documento, tambi\u00e9n a\u00f1adir\u00e9 un campo _tableName para el nombre de la tabla.<\/p>\n<p>Luego, el paso emocionante viene del mapeo de tipos. JSON soporta menos tipos que una base de datos SQL, as\u00ed que tenemos que hacer alguna conversi\u00f3n aqu\u00ed. Esto es lo que hace el m\u00e9todo getJsonTypedValue. Se asegura de que la mayor\u00eda de los tipos JDBC puedan ser convertidos a un tipo JSON nativo (String, number, boolean, array, object, null). Al final, tenemos un JsonDocument que puede ser guardado en Couchbase.<\/p>\n<pre>\n<code>\n        public class JSONRowMapper implements RowMapper<Document> {\n        \n        Table table;\n\n        public JSONRowMapper(Table table) {\n         this.table = table;\n        }\n\n        public JsonDocument mapRow(ResultSet rs, int rowNum) throws SQLException {\n         String id = table.getName() + \"::\" + rs.getString(table.getPrimaryKey());\n         JsonObject obj = JsonObject.create();\n         obj.put(\"_tableName\", table.getName());\n         for (Column col : table.getColumns()) {\n                Object value = getJsonTypedValue(col.type, rs.getObject(col.name), col.name);\n                obj.put(col.name, value);\n         }\n         return JsonDocument.create(id, obj);\n        }\n\n        public Object getJsonTypedValue(int type, Object value, String name) throws SQLException {\n         if (value == null) {\n                return null;\n         }\n         JDBCType current = JDBCType.valueOf(type);\n         switch (current) {\n         case TIMESTAMP:\n                Timestamp timestamp = (Timestamp) value;\n                return timestamp.getTime();\n         case TIMESTAMP_WITH_TIMEZONE:\n                Timestamp ts = (Timestamp) value;\n                JsonObject tsWithTz = JsonObject.create();\n                tsWithTz.put(\"timestamp\", ts.getTime());\n                tsWithTz.put(\"timezone\", ts.getTimezoneOffset());\n                return tsWithTz;\n         case DATE:\n                Date sqlDate = (Date) value;\n                return sqlDate.getTime();\n         case DECIMAL:\n         case NUMERIC:\n                BigDecimal bigDecimal = (BigDecimal) value;\n                return bigDecimal.doubleValue();\n         case ARRAY:\n                Array array = (Array) value;\n                Object[] objects = (Object[]) array.getArray();\n                return JsonArray.from(objects);\n         case BINARY:\n         case BLOB:\n         case LONGVARBINARY:\n                return Base64.getEncoder().encodeToString((byte[]) value);\n         case OTHER:\n         case JAVA_OBJECT:\n                \/\/ database specific, default to String value\n                return value.toString();\n         default:\n                return value;\n         }\n        }\n }\n        \n<\/code><\/pre>\n<p>Con ese RowMapper hace las cosas realmente f\u00e1ciles. Podemos hacer un bucle con el nombre de la tabla, ejecutar la consulta y guardar los resultados en Couchbase. Haciendo esto de una manera sincr\u00f3nica se ver\u00eda as\u00ed:<\/p>\n<pre>\n<code>\n        for (String tableName : tableNames) {\n         String sql = \"select * from \" + tableName + \";\";\n         List<JsonDocument&gt; rs = jdbcTemplate.query(sql, new JSONRowMapper(tables.get(tableName)));\n         if (!rs.isEmpty()) {\n             for (JsonDocument doc : rs) {\n               bucket.upsert(doc); \n                } \n         }\n        }\n        bucket.upsert(schemaDoc);\n<\/code><\/pre>\n<p>Pero prefiero la versi\u00f3n as\u00edncrona:<\/p>\n<pre>\n<code>\n   Observable.from(tableNames).flatMap(s -> {\n        String sql = String.format(\"Select * from %s;\", s);\n        return Observable.from(jdbcTemplate.query(sql, new JSONRowMapper(tables.get(s))));\n    })\n    \/\/ start by a jsonDocument containing the tables to be imported.\n    .startWith(schemaDoc).flatmap(doc -> asyncBucket.upsert(doc));\n<\/code><\/pre>\n<p>Aqu\u00ed no estoy utilizando todo el potencial de Rx; eche un vistazo a <a href=\"https:\/\/github.com\/ldoguin\/couchbase-java-importer\/blob\/master\/src\/main\/java\/com\/couchbase\/devex\/ImportJsonToCouchbase.java\">esta funci\u00f3n<\/a> que escribe un documento en Couchbase y gestiona el tiempo de espera y los errores.<\/p>\n<p>\u00a0<\/p>\n<p>Para mayor comodidad, he empaquetado todos los pasos implementados y mostrados anteriormente en un <a href=\"https:\/\/github.com\/ldoguin\/couchbase-java-importer\">proyecto \u00fanico<\/a>. Todo lo que tienes que hacer es asegurarte de que tu archivo de propiedades est\u00e1 bien configurado y ejecutar el importador:<\/p>\n<pre>\n<code>\n   $ .\/bin\/couchbase-java-importer myConfiguration.properties\n<\/code><\/pre>\n<p>Eche un vistazo al <a href=\"https:\/\/github.com\/ldoguin\/couchbase-java-importer\/blob\/master\/README.md\">L\u00c9AME<\/a> para m\u00e1s informaci\u00f3n.<\/p>\n<h3>Conclusi\u00f3n<\/h3>\n<p>Hoy hemos aprendido a mover contenido SQL a Couchbase, pero todav\u00eda queda algo de trabajo por hacer. La pr\u00f3xima vez os contar\u00e9 c\u00f3mo mover la l\u00f3gica de negocio SQL a la capa de aplicaci\u00f3n.<\/p>","protected":false},"excerpt":{"rendered":"<p>Since the GA release of N1QL, we get a lot of questions about moving content from a SQL database to Couchbase. There are many different ways to do so. Today, I have chosen what is probably the simplest. I will [&hellip;]<\/p>","protected":false},"author":49,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,1812],"tags":[1574],"ppma_author":[9023],"class_list":["post-2130","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-n1ql-query","tag-jdbc"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Moving SQL database content to Couchbase - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/moving-sql-database-content-to-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Moving SQL database content to Couchbase\" \/>\n<meta property=\"og:description\" content=\"Since the GA release of N1QL, we get a lot of questions about moving content from a SQL database to Couchbase. There are many different ways to do so. Today, I have chosen what is probably the simplest. I will [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/moving-sql-database-content-to-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-01-25T13:30:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T00:33:08+00:00\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Moving SQL database content to Couchbase\",\"datePublished\":\"2016-01-25T13:30:01+00:00\",\"dateModified\":\"2025-06-14T00:33:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/\"},\"wordCount\":932,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"jdbc\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/\",\"name\":\"Moving SQL database content to Couchbase - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-01-25T13:30:01+00:00\",\"dateModified\":\"2025-06-14T00:33:08+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Moving SQL database content to Couchbase\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Moving SQL database content to Couchbase - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/moving-sql-database-content-to-couchbase\/","og_locale":"es_MX","og_type":"article","og_title":"Moving SQL database content to Couchbase","og_description":"Since the GA release of N1QL, we get a lot of questions about moving content from a SQL database to Couchbase. There are many different ways to do so. Today, I have chosen what is probably the simplest. I will [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/moving-sql-database-content-to-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-01-25T13:30:01+00:00","article_modified_time":"2025-06-14T00:33:08+00:00","author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Moving SQL database content to Couchbase","datePublished":"2016-01-25T13:30:01+00:00","dateModified":"2025-06-14T00:33:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/"},"wordCount":932,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["jdbc"],"articleSection":["Application Design","Best Practices and Tutorials","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/","name":"Moving SQL database content to Couchbase - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-01-25T13:30:01+00:00","dateModified":"2025-06-14T00:33:08+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Moving SQL database content to Couchbase"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent es un metalero empoll\u00f3n que vive en Par\u00eds. Principalmente escribe c\u00f3digo en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programaci\u00f3n reactiva y otras cosas de moda. Tambi\u00e9n fue Developer Advocate de Clever Cloud y Nuxeo, donde dedic\u00f3 su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","author_category":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent es un metalero empoll\u00f3n que vive en Par\u00eds. Principalmente escribe c\u00f3digo en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programaci\u00f3n reactiva y otras cosas de moda. Tambi\u00e9n fue Developer Advocate de Clever Cloud y Nuxeo, donde dedic\u00f3 su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2130"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2130\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2130"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}