[Este blog foi distribuído pelo site http://blog.grallandco.com].
Introdução
Durante minhas últimas interações com a comunidade do Couchbase, perguntei como posso importar facilmente meus dados do meu banco de dados atual para o Couchbase. E minha resposta era sempre a mesma:
- Use um ETL, como o Talend, para fazer isso
- Basta escrever um pequeno programa para copiar os dados de seu RDBMS para o Couchbase...
Por isso, escrevi este pequeno programa que permite importar o conteúdo de um RDBMS para o Couchbase. Essas ferramentas podem ser usadas como estão, ou você pode dar uma olhada no código para adaptá-lo ao seu aplicativo.
A ferramenta: Importador SQL do Couchbase
O importador de SQL do Couchbase, disponível aquipermite que você, com uma simples linha de comando, copie todo o seu esquema SQL - ou parte dele - para o Couchbase. Antes de explicar como executar esse comando, vamos ver como os dados são armazenados no Couchbase quando são importados:
- Cada linha da tabela é importada como um único documento JSON
- em que cada coluna da tabela se torna um atributo JSON
- Cada documento como uma chave composta pelo nome da tabela e um contador (incremento)
O exemplo concreto a seguir, baseado no Banco de dados de amostra do MySQL WorldO banco de dados de dados de dados do Google, o que o ajudará a entender como ele funciona. Esse banco de dados contém 3 tabelas: City, Country, CountryLanguage. A tabela City tem a seguinte aparência:
+————-+———-+——+—–+———+—————-+
| Campo | Tipo | Nulo | Chave | Padrão | Extra |
+————-+———-+——+—–+———+—————-+
| ID | int(11) | NO | PRI | NULL | auto_incremento |
Nome | char(35) | NO | | | | | | |
| CountryCode | char(3) | NO | | | | | | |
| Distrito | char(20) | NÃO | | | | | |
População | int(11) | NO | | 0 | | |
+————-+———-+——+—–+———+—————-+
O documento JSON que corresponde a essa tabela tem a seguinte aparência:
cidade:3805
{
"Nome": "San Francisco",
"Distrito": "Califórnia",
"ID": 3805,
"População": 776733,
"CountryCode": "USA"
}
{
"Nome": "San Francisco",
"Distrito": "Califórnia",
"ID": 3805,
"População": 776733,
"CountryCode": "USA"
}
Você vê que aqui estou simplesmente pegando todas as linhas e "movendo-as" para o Couchbase. Essa é uma boa primeira etapa para brincar com seu conjunto de dados no Couchbase, mas provavelmente não é o modelo final que você deseja usar para seu aplicativo; na maioria das vezes, você terá de ver quando usar documentos incorporados, lista de valores, etc. em seus documentos JSON.
Além do documento JSON, a ferramenta cria exibições com base na seguinte lógica:
- uma exibição que lista todos os documentos importados com o nome da "tabela" (também conhecida como tipo) como chave
- uma visualização para cada tabela com as colunas de chave primária
Exibir: all/by_type
{
"rows": [
{"key": "city", "value": 4079},
{"key": "country", "value": 239},
{"key": "countrylanguage", "value": 984}
]
}
"rows": [
{"key": "city", "value": 4079},
{"key": "country", "value": 239},
{"key": "countrylanguage", "value": 984}
]
}
Como você pode ver, essa exibição permite que você obtenha, com uma única consulta ao Couchbase, o número de documentos por tipo.
Além disso, para cada tipo de tabela/documento, é criada uma exibição em que a chave do índice é construída a partir da chave primária da tabela. Vamos, por exemplo, consultar os documentos "Cidade".
Exibir: city/by_pk?reduce=false&limit=5
{
"total_rows": 4079,
"rows": [
{"id": "city:1", "key": 1, "value": null},
{"id": "city:2", "key": 2, "value": null},
{"id": "city:3", "key": 3, "value": null},
{"id": "city:4", "key": 4, "value": null},
{"id": "city:5", "key": 5, "value": null}
]
}
"total_rows": 4079,
"rows": [
{"id": "city:1", "key": 1, "value": null},
{"id": "city:2", "key": 2, "value": null},
{"id": "city:3", "key": 3, "value": null},
{"id": "city:4", "key": 4, "value": null},
{"id": "city:5", "key": 5, "value": null}
]
}
A chave de índice corresponde ao valor da coluna City.ID. Quando a chave primária é composta de várias colunas, a chave se parece com:
Ver: CountryLanguage/by_pk?reduce=false&limit=5
{
"total_rows": 984,
"rows": [
{"id": "countrylanguage:1", "key": ["ABW", "Dutch"], "value": null},
{"id": "countrylanguage:2", "key": ["ABW", "English"], "value": null},
{"id": "countrylanguage:3", "key": ["ABW", "Papiamento"], "value": null},
{"id": "countrylanguage:4", "key": ["ABW", "Spanish"], "value": null},
{"id": "countrylanguage:5", "key": ["AFG", "Balochi"], "value": null}
]
}
"total_rows": 984,
"rows": [
{"id": "countrylanguage:1", "key": ["ABW", "Dutch"], "value": null},
{"id": "countrylanguage:2", "key": ["ABW", "English"], "value": null},
{"id": "countrylanguage:3", "key": ["ABW", "Papiamento"], "value": null},
{"id": "countrylanguage:4", "key": ["ABW", "Spanish"], "value": null},
{"id": "countrylanguage:5", "key": ["AFG", "Balochi"], "value": null}
]
}
Essa visualização é criada a partir da chave primária da tabela CountryLanguage, composta pelas colunas CountryLanguage.CountryCode e CountryLanguage.Language.
+————-+—————+——+—–+———+——-+
| Campo | Tipo | Nulo | Chave | Padrão | Extra |
+————-+—————+——+—–+———+——-+
CountryCode | char(3) | NO | PRI | | | | |
Idioma | char(30) | NO | PRI | | | | |
| IsOfficial | enum('T','F') | NO | | | F | | |
Percentual | float(4,1) | NO | | 0.0 | | |
+————-+—————+——+—–+———+——-+
| Campo | Tipo | Nulo | Chave | Padrão | Extra |
+————-+—————+——+—–+———+——-+
CountryCode | char(3) | NO | PRI | | | | |
Idioma | char(30) | NO | PRI | | | | |
| IsOfficial | enum('T','F') | NO | | | F | | |
Percentual | float(4,1) | NO | | 0.0 | | |
+————-+—————+——+—–+———+——-+
Como usar a ferramenta Couchbase SQL Importer?
O importador é um utilitário simples de linha de comando baseado em Java, bastante simples de usar:
1. Faça o download do Arquivo CouchbaseSqlImporter.jar a partir daqui. Esse arquivo contém todas as dependências para trabalhar com o Couchbase: o Java Couchbase Client e o GSON.
2. Faça o download do driver JDBC para o banco de dados que você está usando como fonte de dados. Neste exemplo, estou usando o MySQL e baixei o driver para o site do MySQL.
3. Configure a importação usando um arquivo de propriedades.
## Informações sobre o SQL ##
sql.connection=jdbc:mysql://192.168.99.19:3306/world
sql.username=root
sql.password=password## Informações do Couchbase ##
cb.uris=http://localhost:8091/pools
cb.bucket=default
cb.password=## Informações de importação
import.tables=ALL
import.createViews=true
import.typefield=type
import.fieldcase=lower
sql.connection=jdbc:mysql://192.168.99.19:3306/world
sql.username=root
sql.password=password## Informações do Couchbase ##
cb.uris=http://localhost:8091/pools
cb.bucket=default
cb.password=## Informações de importação
import.tables=ALL
import.createViews=true
import.typefield=type
import.fieldcase=lower
Esse exemplo de arquivo de propriedades contém três seções:
- As duas primeiras seções são usadas para configurar as conexões com o banco de dados SQL e o cluster do Couchbase (observe que o bucket deve ser criado primeiro)
- A terceira seção permite que você configure a importação propriamente dita
- importar.tabelas : ALL para importar todas as tabelas, ou a lista de tabelas que você deseja importar, por exemplo, City, Country
- import.createViews : verdadeiro ou falso, para forçar a criação das exibições.
- import.typefield : é usado para adicionar um novo atributo em todos os documentos que contêm o "tipo".
- import.fieldcase : null, lower, upper : isso forçará o caso do nome dos atributos e o valor do tipo (City ou city ou CITY, por exemplo)
- 4. Execute a ferramenta!
java -cp "./CouchbaseSqlImporter.jar:./mysql-connector-java-5.1.25-bin.jar" com.couchbase.util.SqlImporter import.properties
Portanto, você executa o comando Java com o classpath adequado (parâmetro -cp).
E pronto, você pode obter os dados do seu banco de dados SQL para o Couchbase.
Se estiver interessado em ver como ele está funcionando internamente, dê uma olhada no próximo parágrafo.
O Código: Como ele funciona?
A classe principal da ferramenta é muito simples com.couchbase.util.SqlImporterO processo é:
1. Conecte-se ao banco de dados SQL
2. Conectar-se ao Couchbase
3. Obter a lista de tabelas
4. Para cada tabela, execute um "select * from table"
4.1. Analisar o ResultSetMetadata para obter a lista de colunas
4.2. Crie um mapa Java para cada linha em que a chave seja o nome das colunas e o valor... seja o valor
4.3. Serialize esse mapa em um documento GSON e salve-o no Couchbase
O código está disponível na seção ImportTable(String table) Método Java.
Um ponto interessante é que você pode usar e estender o código para lidar com seu aplicativo.
Conclusão
Criei essa ferramenta rapidamente para ajudar algumas pessoas da comunidade. Se você a estiver usando e precisar de novos recursos, avise-me por meio de comentários ou solicitações.