繁体   English   中英

表元数据从sqlserver传输到postgresql使用SQLAlchemy

[英]Table metadata transfer from sqlserver to postgresql using SQLAlchemy

我正在尝试使用 python 脚本将我的数据库从 ms sql 服务器迁移到 PostgreSQL。 在迁移数据之前,脚本需要创建所需的表。

我打算使用 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 的映射一样简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM