{"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\/pt\/moving-sql-database-content-to-couchbase\/","title":{"rendered":"Movendo o conte\u00fado do banco de dados SQL para o Couchbase"},"content":{"rendered":"<p>Desde a vers\u00e3o GA do N1QL, recebemos muitas perguntas sobre a transfer\u00eancia de conte\u00fado de um banco de dados SQL para o Couchbase. H\u00e1 muitas maneiras diferentes de fazer isso. Hoje, escolhi a que provavelmente \u00e9 a mais simples. Transformarei cada linha de cada tabela em um JsonDocument e o armazenarei no Couchbase. Farei meu teste com o Postgres e seu <a href=\"https:\/\/www.postgresqltutorial.com\/postgresql-sample-database\/\">conjunto de dados de amostra<\/a> inspirado no MySQL <a href=\"https:\/\/dev.mysql.com\/doc\/sakila\/en\/\">Amostra de Sakila<\/a>. Usarei Java, mas as diretrizes apresentadas aqui s\u00e3o aplic\u00e1veis a outras linguagens.<\/p>\n<h2>Conex\u00e3o a um banco de dados SQL em execu\u00e7\u00e3o<\/h2>\n<p>Como estou usando Java, implementarei o Spring Boot e seu pacote JDBC, que cuida da conex\u00e3o com o banco de dados para mim. Tudo o que preciso fazer \u00e9 definir as depend\u00eancias e propriedades corretas para configurar o <a href=\"https:\/\/docs.spring.io\/spring\/docs\/current\/javadoc-api\/org\/springframework\/jdbc\/core\/JdbcTemplate.html\">JdbcTemplate<\/a>. Esse objeto facilita a execu\u00e7\u00e3o de uma consulta SQL.<\/p>\n<h3>Depend\u00eancias<\/h3>\n<p>Para garantir que tudo esteja configurado de forma organizada e autom\u00e1tica, voc\u00ea precisa das seguintes depend\u00eancias:<\/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>Estou testando com o Postgres, mas voc\u00ea pode adicionar qualquer outro driver compat\u00edvel com o Spring JDBC. O spring-boot-starter-data-jpa permitir\u00e1 que eu injete o JdbcTemplate pr\u00e9-configurado.<\/p>\n<h3>Configura\u00e7\u00e3o<\/h3>\n<p>Para garantir que a estrutura do Spring encontre seu banco de dados, adicione as seguintes propriedades ao seu arquivo de configura\u00e7\u00e3o (por exemplo, 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>\u00c9 claro que voc\u00ea precisar\u00e1 ajustar isso de acordo com o banco de dados que estiver usando. Aqui estou usando o Postgres em execu\u00e7\u00e3o em 192.168.99.100 com a porta padr\u00e3o 5432. O nome do banco de dados que quero usar \u00e9 dvdrental.<\/p>\n<h3>C\u00f3digo<\/h3>\n<p>Se tudo estiver configurado corretamente, voc\u00ea poder\u00e1 injetar o JdbcTemplate e come\u00e7ar a consultar o banco de dados 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>Conex\u00e3o com o Couchbase<\/h2>\n<p>Meu objetivo \u00e9 mover o conte\u00fado de um banco de dados SQL para o Couchbase, portanto, tamb\u00e9m precisamos de uma conex\u00e3o com o Couchbase.<\/p>\n<h3>Depend\u00eancias<\/h3>\n<p>Para trabalhar com o Couchbase em seu projeto Java, \u00e9 necess\u00e1rio adicionar a seguinte depend\u00eancia:<\/p>\n<pre>\n<code>\n   dependencies {\n        compile \"com.couchbase.client:java-client:2.2.3\"\n    }\n<\/code><\/pre>\n<p>Isso lhe dar\u00e1 acesso ao Couchbase<a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.1\/sdks\/java-2.2\/java-intro.html\"> Java SDK<\/a>.<\/p>\n<h3>Configura\u00e7\u00e3o<\/h3>\n<p>Uma configura\u00e7\u00e3o b\u00e1sica do Couchbase requer basicamente tr\u00eas propriedades: um endere\u00e7o IP do servidor, um nome de bucket e uma senha de bucket. Fazer isso no Spring Boot seria parecido com o seguinte:<\/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>As propriedades nome do host, bucket e senha podem ser adicionadas diretamente ao arquivo de propriedades do aplicativo.<\/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>Com o Couchbase, o n\u00edvel de granularidade equivalente de um banco de dados seria um bucket, que \u00e9 onde voc\u00ea armazena documentos. Com a configura\u00e7\u00e3o anterior, voc\u00ea pode simplesmente injetar um bucket e come\u00e7ar a brincar.<\/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>Tabelas<\/h2>\n<p>Neste ponto, voc\u00ea tem uma conex\u00e3o com um banco de dados SQL e com o Couchbase. Agora podemos come\u00e7ar a mover as coisas. A maneira mais f\u00e1cil de mover dados \u00e9 considerar cada linha de cada tabela como um documento.<\/p>\n<h3>Obtendo o esquema SQL<\/h3>\n<p>Vamos come\u00e7ar obtendo o esquema do banco de dados automaticamente usando o JdbcTemplate. O objeto interessante aqui \u00e9 <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/sql\/DatabaseMetaData.html\">DatabaseMetaData<\/a>que pode nos fornecer a estrutura completa do banco de dados. A API n\u00e3o \u00e9 a mais f\u00e1cil de usar, mas pelo menos est\u00e1 documentada.<\/p>\n<p>Vou mapear o resultado da consulta DatabaseMetaData para uma lista de tabelas e colunas. Para isso, criei a seguinte classe 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, n\u00e3o \u00e9 o c\u00f3digo mais empolgante de se escrever, mas no final voc\u00ea obt\u00e9m uma representa\u00e7\u00e3o JSON das tabelas do seu banco de dados 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>Conte\u00fado<\/h3>\n<p>Aqui est\u00e1 a parte divertida. \u00c9 aqui que come\u00e7amos a mapear uma linha de tabela para um JsonDocument. A se\u00e7\u00e3o anterior nos coloca em um estado em que podemos recuperar o nome de todas as tabelas. A partir de um nome de tabela, podemos criar uma consulta SQL que retorna todas as linhas da tabela.<\/p>\n<p>O Spring tem um mecanismo que permite que voc\u00ea defina um RowMapper. Para cada linha retornada pela consulta, voc\u00ea pode retornar o objeto que desejar. Como estou usando o Couchbase, quero um <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 seguir, um exemplo de implementa\u00e7\u00e3o. Esse RowMapper precisa de um objeto Table previamente definido; portanto, temos de implementar o m\u00e9todo mapRow. H\u00e1 v\u00e1rias coisas que precisamos fazer aqui.<\/p>\n<p>A primeira tarefa \u00e9 criar uma chave exclusiva. Como o escopo das linhas \u00e9 definido por tabelas, alguns IDs podem ser exatamente os mesmos para linhas em tabelas diferentes. Mas os documentos t\u00eam escopo por bucket, portanto, precisamos criar uma chave de documento exclusiva que reflita o ID da linha e o nome da tabela. Para manter o controle da origem do documento, tamb\u00e9m adicionarei um campo _tableName para o nome da tabela.<\/p>\n<p>Em seguida, a etapa interessante vem do mapeamento de tipos. O JSON \u00e9 compat\u00edvel com menos tipos do que um banco de dados SQL, portanto, temos que fazer algumas convers\u00f5es aqui. \u00c9 isso que o m\u00e9todo getJsonTypedValue faz. Ele garante que a maioria dos tipos JDBC possa ser convertida em um tipo JSON nativo (String, n\u00famero, booleano, matriz, objeto, nulo). No final, temos um JsonDocument que pode ser salvo no 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>Com esse RowMapper, as coisas ficam muito f\u00e1ceis. Podemos fazer um loop pelo nome da tabela, executar a consulta e salvar os resultados no Couchbase. Fazer isso de forma s\u00edncrona seria assim:<\/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>Mas eu prefiro a vers\u00e3o ass\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>Aqui n\u00e3o estou usando todo o potencial do Rx; d\u00ea uma olhada em <a href=\"https:\/\/github.com\/ldoguin\/couchbase-java-importer\/blob\/master\/src\/main\/java\/com\/couchbase\/devex\/ImportJsonToCouchbase.java\">esta fun\u00e7\u00e3o<\/a> que grava um documento no Couchbase e lida com o tempo limite e o gerenciamento de erros.<\/p>\n<p>\u00a0<\/p>\n<p>Por conveni\u00eancia, agrupei todas as etapas implementadas e mostradas anteriormente em um arquivo <a href=\"https:\/\/github.com\/ldoguin\/couchbase-java-importer\">projeto \u00fanico<\/a>. Tudo o que voc\u00ea precisa fazer \u00e9 verificar se o arquivo de propriedades est\u00e1 configurado corretamente e executar o importador:<\/p>\n<pre>\n<code>\n   $ .\/bin\/couchbase-java-importer myConfiguration.properties\n<\/code><\/pre>\n<p>D\u00ea uma olhada no <a href=\"https:\/\/github.com\/ldoguin\/couchbase-java-importer\/blob\/master\/README.md\">LEIAME<\/a> para obter mais informa\u00e7\u00f5es.<\/p>\n<h3>Conclus\u00e3o<\/h3>\n<p>Hoje, aprendemos a mover o conte\u00fado SQL para o Couchbase, mas ainda h\u00e1 algum trabalho a ser feito. Na pr\u00f3xima vez, falarei sobre como mover a l\u00f3gica de neg\u00f3cios do SQL para a camada de aplicativos.<\/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\/pt\/moving-sql-database-content-to-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\",\"@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\/pt\/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\/pt\/moving-sql-database-content-to-couchbase\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/moving-sql-database-content-to-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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":"pt-BR","@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 \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na 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\/pt\/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 \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2130"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2130\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2130"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}