我正在使用Python从一个数据库服务器(当前为DB2)到另一数据库服务器(MSSQL)创建快速,肮脏的ETL。我只是登陆数据,所以没有任何转换发生。我编写的代码可以工作,但是必须首先检索整个数据集,然后将整个数据集插入到目标位置。
我想创建一个解决方案,允许我指定要从源中拉出的'x'行数,并将其批处理到目的地。
我肯定那里有一个优雅的解决方案,但是我对Python不够熟悉。 我只是在寻找有关实现,使用方法或技术的建议。
我正在使用SQLAlchemy和熊猫来完成任务。我的源表和目标表是相同的(尽可能多,因为SQL实现之间的数据类型不同)。我正在填充一个数据框,然后使用MetaData和automap_base批量插入数据。
def bulkInsert(engine, df, tableName, schemaName = 'dbo'):
metadata = MetaData()
metadata.reflect(engine, only = [tableName], schema = schemaName)
Base = automap_base(metadata = metadata)
Base.prepare()
tableToInsert = Base.classes[tableName]
conn = engine.connect()
Session = sessionmaker(bind = conn)
session = Session()
session.bulk_insert_mappings(tableToInsert, df.to_dict(orient="records"), render_nulls = True)
session.commit()
session.close()
conn.close()
db2 = db2Connect(db2Server)
df = pd.read_sql(query, db2, coerce_float=False)
db2.close()
engine = mssqlSAEngine(server, database)
bulkInsert(engine, df.where(pd.notnull(df), None), tableName)
我成功插入数据没有问题。但是,当我接近百万行标记时,我的系统内存不足,并且数据开始分页。自然,性能会大大下降。
我们确实有其他工具(例如SSIS),但是我正在寻找一种动态方法。在SSIS中,我可以编写C#脚本任务来基本完成我在Python中所做的工作,也可以为每个表创建自定义DFT。使用这种方法,我只需要传递源和目标即可。