[This blog was syndicated from https://blog.grallandco.com]
Introducción
Durante mis últimas interacciones con la comunidad de Couchbase, me surgió la pregunta de cómo puedo importar fácilmente mis datos de mi base de datos actual a Couchbase. Y mi respuesta era siempre la misma:
- Utilice un ETL como Talend para hacerlo
- Sólo tienes que escribir un pequeño programa para copiar los datos de tu RDBMS a Couchbase...
Así que he escrito este pequeño programa que te permite importar el contenido de un RDBMS a Couchbase. Esta herramienta se puede usar tal cual, o puedes mirar el código para adaptarlo a tu aplicación.
La herramienta: Importador SQL de Couchbase
El importador SQL de Couchbase, disponible aquíte permite con una simple línea de comandos copiar todo -o parte- de tu esquema SQL en Couchbase. Antes de explicar cómo ejecutar este comando, veamos cómo se almacenan los datos en Couchbase cuando se importan:
- Cada fila de la tabla se importa en un único documento JSON
- donde cada columna de la tabla se convierte en un atributo JSON
- Cada documento como una clave formada por el nombre de la tabla y un contador (incremento)
El siguiente ejemplo concreto, basado en el Base de datos de ejemplo MySQL Worldle ayudará a comprender su funcionamiento. Esta base de datos contiene 3 tablas : Ciudad, País, PaísIdioma. La tabla Ciudad tiene el siguiente aspecto:
+————-+———-+——+—–+———+—————-+
| Campo Tipo Nulo Clave Predeterminado Extra
+————-+———-+——+—–+———+—————-+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| Nombre | char(35) | NO | | | | |
| CountryCode | char(3) | NO | | | | |
| Distrito | char(20) | NO | | | | |
| Población | int(11) | NO | | 0 | |
+————-+———-+——+—–+———+—————-+
El documento JSON que corresponde a esta tabla tiene el siguiente aspecto:
ciudad:3805
{
"Nombre": "San Francisco",
"Distrito": "California",
"ID": 3805,
"Población": 776733,
"CountryCode": "USA"
}
{
"Nombre": "San Francisco",
"Distrito": "California",
"ID": 3805,
"Población": 776733,
"CountryCode": "USA"
}
Ves que aquí simplemente estoy cogiendo todas las filas y "moviéndolas" a Couchbase. Este es un buen primer paso para jugar con tu conjunto de datos en Couchbase, pero probablemente no es el modelo final que quieres usar para tu aplicación; la mayoría de las veces tendrás que ver cuando usar documentos incrustados, lista de valores, .. en tus documentos JSON.
Además del documento JSON, la herramienta crea vistas basadas en la siguiente lógica:
- una vista que enumera todos los documentos importados con el nombre de la "tabla" (alias tipo) como clave
- una vista para cada tabla con las columnas de clave primaria
Vista: todos/por_tipo
{
"filas": [
{"clave": "ciudad", "valor": 4079},
{"clave": "país", "valor": 239},
{"clave": "countrylanguage", "value": 984}
]
}
"filas": [
{"clave": "ciudad", "valor": 4079},
{"clave": "país", "valor": 239},
{"clave": "countrylanguage", "value": 984}
]
}
Como puedes ver esta vista te permite obtener con una sola consulta a Couchbase el número de documentos por tipo.
También para cada tipo de tabla/documento, se crea una vista donde la clave del índice se construye a partir de la clave primaria de la tabla. Por ejemplo, consultemos los documentos "Ciudad".
Ver: ciudad/por_pk?reduce=false&limit=5
{
"total_rows": 4079,
"filas": [
{"id": "ciudad:1", "clave": 1, "valor": null},
{"id": "ciudad:2", "clave": 2, "valor": null},
{"id": "ciudad:3", "clave": 3, "valor": null},
{"id": "ciudad:4", "clave": 4, "valor": null},
{"id": "ciudad:5", "clave": 5, "valor": null}
]
}
"total_rows": 4079,
"filas": [
{"id": "ciudad:1", "clave": 1, "valor": null},
{"id": "ciudad:2", "clave": 2, "valor": null},
{"id": "ciudad:3", "clave": 3, "valor": null},
{"id": "ciudad:4", "clave": 4, "valor": null},
{"id": "ciudad:5", "clave": 5, "valor": null}
]
}
La clave de índice coincide con el valor de la columna Ciudad.ID. Cuando la clave primaria se compone de varias columnas, la clave tiene el siguiente aspecto:
Ver: CountryLanguage/by_pk?reduce=false&limit=5
{
"total_rows": 984,
"filas": [
{"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", "Español"], "valor": null},
{"id": "countrylanguage:5", "key": ["AFG", "Balochi"], "value": null}
]
}
"total_rows": 984,
"filas": [
{"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", "Español"], "valor": null},
{"id": "countrylanguage:5", "key": ["AFG", "Balochi"], "value": null}
]
}
Esta vista se construye a partir de la clave primaria de la tabla CountryLanguage formada por las columnas CountryLanguage.CountryCode y CountryLanguage.Language.
+————-+—————+——+—–+———+——-+
| Campo Tipo Nulo Clave Predeterminado Extra
+————-+—————+——+—–+———+——-+
| CountryCode | char(3) | NO | PRI | | | |
| Idioma | char(30) | NO | PRI | | |
| IsOfficial | enum('T','F') | NO | | F | |
| Porcentaje | float(4,1) | NO | | 0.0 | |
+————-+—————+——+—–+———+——-+
| Campo Tipo Nulo Clave Predeterminado Extra
+————-+—————+——+—–+———+——-+
| CountryCode | char(3) | NO | PRI | | | |
| Idioma | char(30) | NO | PRI | | |
| IsOfficial | enum('T','F') | NO | | F | |
| Porcentaje | float(4,1) | NO | | 0.0 | |
+————-+—————+——+—–+———+——-+
¿Cómo utilizar la herramienta Couchbase SQL Importer?
El importador es una sencilla utilidad de línea de comandos basada en Java, bastante fácil de usar:
1. Descargue el CouchbaseSqlImporter.jar desde aquí. Este archivo contiene todas las dependencias para trabajar con Couchbase: el cliente Java Couchbase y GSON.
2. Descargue el controlador JDBC para la base de datos que está utilizando como fuente de datos. Para este ejemplo estoy usando MySQL y he descargado el driver para MySQL Site.
3. Configure la importación mediante un archivo de propiedades.
## Información SQL ##
sql.connection=jdbc:mysql://192.168.99.19:3306/world
sql.nombreusuario=root
sql.password=contraseña## Información de Couchbase ##
cb.uris=https://localhost:8091/pools
cb.bucket=pordefecto
cb.password=## Información de importación
importar.tablas=ALL
import.createViews=true
import.typefield=tipo
import.fieldcase=lower
sql.connection=jdbc:mysql://192.168.99.19:3306/world
sql.nombreusuario=root
sql.password=contraseña## Información de Couchbase ##
cb.uris=https://localhost:8091/pools
cb.bucket=pordefecto
cb.password=## Información de importación
importar.tablas=ALL
import.createViews=true
import.typefield=tipo
import.fieldcase=lower
Este archivo de propiedades de ejemplo contiene tres secciones :
- Las dos primeras secciones se utilizan para configurar las conexiones a su base de datos SQL y al clúster Couchbase (tenga en cuenta que primero debe crearse el bucket)
- La tercera sección permite configurar la propia importación
- importar.tablas : ALL para importar todas las tablas, o una la lista de tablas que desea importar, por ejemplo Ciudad, País
- import.createViews : verdadero o falso, para forzar la creación de las vistas.
- campo.tipo.import : se utiliza para añadir un nuevo atributo en todos los documentos que contengan el "tipo".
- import.fieldcase : null, lower, upper : esto forzará el caso del nombre de los atributos y el valor del tipo (Ciudad o city o CITY por ejemplo)
- 4. Ejecute la herramienta.
java -cp "./CouchbaseSqlImporter.jar:./mysql-connector-java-5.1.25-bin.jar" com.couchbase.util.SqlImporter import.properties
Así que ejecuta el comando Java con el classpath adecuado (parámetro -cp).
Y ya está, puedes obtener tus datos de tu base de datos SQL en Couchbase.
Si está interesado en ver cómo funciona internamente, puede echar un vistazo al siguiente párrafo.
El Código: ¿Cómo funciona?
La clase principal de la herramienta es realmente sencilla com.couchbase.util.SqlImporterel proceso es:
1. Conectarse a la base de datos SQL
2. Conectar a Couchbase
3. Obtener la lista de tablas
4. Para cada tabla ejecute un "select * from table"
4.1. Analizar el ResultSetMetadata para obtener la lista de columnas
4.2. Crear un mapa Java para cada fila donde la clave es el nombre de las columnas y el valor...es el valor
4.3. Serializa este Mapa en un documento GSON y guárdalo en Couchbase
El código está disponible en ImportTable(String table) Método Java.
Un punto interesante es que puedes utilizar y ampliar el código para adaptarlo a tu aplicación.
Conclusión
He creado esta herramienta rápidamente para ayudar a algunas personas en la comunidad, si usted lo está utilizando y necesita nuevas características, hágamelo saber, mediante comentario o pull request.