我正试图将我的数据库从ms sql server迁移到PostgreSQL使用python脚本。在迁移数据之前,脚本需要创建所需的表。
我打算使用sqlalchemy创建所需的表,然后迁移实际的数据。下面是示例代码。在pgsql中创建表时,脚本失败,因为pgsql中没有像tinyint这样的数据类型。我认为sqlalchemy抽象了这些数据类型
对于这类用例的任何建议和最佳实践都将大有帮助
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)
虽然我没有做过ms sql到postgreSQL的路径,但我已经做了一些其他的(小到微小的)迁移,并且对您正在查看的两个数据库都有一些小的经验。您的特定问题的解决方案可能最好通过映射功能来完成。有一个库,我看过,但从来没有得到使用,其中包含这样的映射:https://pgloader.readthedocs.io/en/latest/ref/mssql.html?highlight=tinyint%20 default-ms-sql-casting-rules
由于数据迁移通常只进行一次,所以我建议使用现有的工具。根据我的理解,SQLAlchemy并不是一个真正的工具,但是通过一些努力,它可能会变成一个这样的工具。
关于你关于SQLAlchemy抽象数据的问题,我不会反对SQLAlchemy。Tinyint是一个1字节的数据类型。在postgreSQL中没有这样的数据类型,这使得直接映射是不可能的。因此在pgloader(上面的链接)中找到了映射。https://learn.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
最后一些关于这里可用的元信息的想法。在你发布了最初的问题6个月后,你似乎在提供赏金,这很有趣,因为它要么是一个巨大的项目,要么是一个你没有分配很多时间的项目。无论哪种方式,我都建议您使用现有的工具,而不是试图使某些东西超出其预期用途。另一件事是包含了pandas导入。如果您正在考虑使用pandas进行数据传输,我想提醒您这样一个事实:pandas对数据格式非常宽容。这对您来说可能不是问题,但是一个更受控制的数据管道可能更不容易出错。
考虑到上一段,在给你指出正确的方向之前,我想了解更多的总体情况。数据库迁移也可能有其他不可预见的后果,所以我不想给人留下这样的印象,即解决您的整个问题是像tinyint到smallint映射那样简单的快速修复。