如何使用Python对SQL源数据和SQL目标数据进行批处理/批量处理?

时间:2019-02-07 16:49:51

标签: python sql-server sqlalchemy db2

我正在使用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)

开始批量插入,将NaN替换为NULL

bulkInsert(engine, df.where(pd.notnull(df), None), tableName)

我成功插入数据没有问题。但是,当我接近百万行标记时,我的系统内存不足,并且数据开始分页。自然,性能会大大下降。

我们确实有其他工具(例如SSIS),但是我正在寻找一种动态方法。在SSIS中,我可以编写C#脚本任务来基本完成我在Python中所做的工作,也可以为每个表创建自定义DFT。使用这种方法,我只需要传递源和目标即可。

0 个答案:

没有答案