Estoy tratando de migrar mi base de datos del servidor ms sql a PostgreSQL usando el script python. Antes de migrar los datos, el script debe crear las tablas requeridas.
Tengo la intención de usar sqlalchemy para crear las tablas requeridas y luego migrar los datos reales. A continuación se muestra el código de ejemplo. Al crear una tabla en pgsql, el script falla porque no hay un tipo de datos como tinyint en pgsql. Pensé que sqlalchemy abstrae estos tipos de datos.
Cualquier sugerencia y mejores prácticas para este tipo de casos de uso serán de gran ayuda.
from sqlalchemy import create_engine, MetaData, select, func, Table import pandas as pd engine_pg = create_engine('postgresql://XXXX:YYYY$@10.10.1.4:5432/pgschema') engine_ms = create_engine('mssql+pyodbc://XX:YY@10.10.1.5/msqlschema?driver=SQL+Server') ms_metadata = MetaData(bind=engine_ms) pg_metadata = MetaData(bind=engine_pg) #extract Node table object from mssql using ms_metadat and engine_ms Node = Table('Node', ms_metadata, autoload_with=engine_ms) #create Node table in pgsql using the Node table object Node.create(bind=engine_pg)Si bien no he realizado la ruta de ms sql a postgreSQL, he realizado otras migraciones (pequeñas a pequeñas) y tengo una experiencia menor con las dos bases de datos que está viendo. La solución a su problema específico probablemente se haga mejor a través de una funcionalidad de mapeo. Hay una biblioteca que he mirado pero que nunca he usado y que contiene tales asignaciones: https://pgloader.readthedocs.io/en/latest/ref/mssql.html?highlight=tinyint%20#default-ms- reglas de conversión de sql
Dado que una migración de datos generalmente se realiza solo una vez, recomendaría utilizar una herramienta existente. SQLAlchemy no es realmente una herramienta de este tipo, según tengo entendido, pero podría convertirse en una con algo de esfuerzo.
Con respecto a su pregunta sobre SQLAlchemy que abstrae los datos, no mantendría esta situación en contra de SQLAlchemy. Tinyint es un tipo de datos de 1 byte. No hay tal tipo de datos disponible en postgreSQL, lo que hace imposible un mapeo directo. De ahí el mapeo en pgloader (vinculado arriba). https://docs.microsoft.com/en-us/sql/t-sql/data-types/int-bigint-smallint-and-tinyint-transact-sql?view=sql-server-ver15
https://www.postgresql.org/docs/9.1/datatype-numeric.html
Finalmente, algunos pensamientos sobre la metainformación disponible aquí. Parece que está ofreciendo una recompensa por estos 6 meses después de publicar la pregunta original, lo cual es interesante ya que es un proyecto enorme o uno al que no le asigna mucho tiempo. De cualquier manera, le insto a que use una herramienta existente en lugar de tratar de hacer que algo funcione más allá de su uso previsto. Otra cosa es la inclusión de la importación de pandas. Si está pensando en usar pandas para la transferencia de datos, quiero advertirle sobre el hecho de que pandas es muy indulgente con los formatos de datos. Es posible que esto no sea un problema para usted, pero una canalización de datos más controlada probablemente sería menos propensa a errores.
Dado el párrafo anterior, me gustaría obtener más información sobre la situación general antes de indicarle la dirección correcta. La migración de la base de datos también puede tener otras consecuencias imprevistas, por lo que no quiero dar la impresión de que la solución a su problema general es una solución rápida tan simple como un mapeo de minúsculo a minúsculo.