0 votos
Debo migrar una base de datos relacional (SQL Server) a una no relacional (MongoDB) mediante Python. ¿Como podría abarcar esto? Ya tengo claro el modelado de datos no relacional pero no se como podría iniciar la migración.

Gracias de ante mano
por en Python
editado por

1 Respuesta

0 votos

Buenas Mario.

Depende un poco de la complejidad de lo que quieras pasar. A grandes rasgos con Python podrías crear una conexión a la base de datos SQL Server y luego otra a MongoDB. Luego en Python a mano y con cuidado crear las consultas de obtención de datos (SELECT...; como en https://datatofish.com/how-to-connect-python-to-sql-server-using-pyodbc/). Por Streaming para no sobrecargar la memoria de la máquina que ejecuta el script de Python si la base de datos tiene mucha carga; es decir, mientras estás leyendo cada dato en el bucle for lo pides y lo mandas directamente a MongoDB (como por ejemplo en https://www.geeksforgeeks.org/mongodb-python-insert-update-data/).

En pseudo código Python sería algo así:

import pyodbc
from pymongo import MongoClient 


nombre_del_servidor = "miservidor"
nombre_de_la_base_de_datos = "midb"

conn_sql = pyodbc.connect('Driver={{SQL Server}};'
                      'Server={};'
                      'Database={};'
                      'Trusted_Connection=yes;'.format(
                          nombre_del_servidor,
                          nombre_de_la_base_de_datos))

cursor = conn_sql.cursor()
cursor.execute('SELECT * FROM midb.tabla ...')

conn_mongo = MongoClient()
db = conn_mongo.database
collection = db.mi_coleccion


for row in cursor:
    # Convertir los valores y las filas
    # Para convertir las filas a objeto JSON puedes utilizar: https://docs.python.org/3.7/library/json.html
    fila_convertida_para_mongo = row
    id = collection.insert_one(fila_convertida_para_mongo) 

Tienes algunos ejemplos e información útil en https://stackoverflow.com/questions/32699431/migrate-from-sql-to-mongodb y https://www.quora.com/How-do-I-transfer-data-from-the-SQL-Server-database-to-MongoDB

por

La base de datos que se debe migrar es bastante extensa, una de las consideraciones que tuve era usar la función Yield para encapsular los datos y que se vaya liberando la memoria en el ciclo for. El 'problema', por llamarlo de alguna forma, es que debo transformar la bd relacional a una nueva bd no relacional, ¿como atrapo cada dato y lo ingreso en la nueva bd?

 

Gracias por la primera respuesta, Ramon.

Como bien comentas, para no quedarte sin memoria lo mejor que puedes hacer es un iterador, aunque con suerte no parece que lo necesites, pues el cursor parece serlo (según pone en https://github.com/mkleehammer/pyodbc/wiki/Cursor), por lo que no necesitarías implementar nada, en el for ya te trae una fila y cuando terminas de utilizarla ya no la necesitarías. Tendrás que probar esto con datos reales, por los posibles cacheos que puedan tener las bibliotecas, y que tu código sea completamente por Streaming de datos.

Tienes más información en https://docs.microsoft.com/es-es/sql/connect/python/pyodbc/python-sql-driver-pyodbc?view=sql-server-2017

Por otro lado, tienes unos ejemplos de paso de Pyodbc a Mongo DB en https://stackoverflow.com/questions/7747192/issues-converting-python-list-for-mongodb-import