SQLAlchemy Core批量插入速度慢

Res*_*ieC 2 python postgresql orm sqlalchemy

我正在尝试截断一个表并使用SQLAlchemy仅插入约3000行数据,这非常慢(约10分钟)。

我遵循了此文档上的建议,并利用了sqlalchemy核心来进行插入,但是运行速度仍然非常慢。我有哪些可能的罪魁祸首?数据库是一个postgres RDS实例。谢谢!

engine = sa.create_engine(db_string, **kwargs, pool_recycle=3600)
with engine.begin() as conn:
            conn.execute("TRUNCATE my_table")
            conn.execute(
                MyTable.__table__.insert(),
                data #where data is a list of dicts
            )
Run Code Online (Sandbox Code Playgroud)

diz*_*zyf 6

当我看到这没有答案时,我感到无比沮丧。前几天,我遇到了完全相同的问题:尝试使用CORE向Postgres RDS实例批量插入数百万行。这花了几个小时

作为一种解决方法,我最终编写了自己的批量插入脚本,该脚本生成了原始sql本身:

bulk_insert_str = []
for entry in entry_list:
    val_str = "('{}', '{}', ...)".format(entry["column1"], entry["column2"], ...)
    bulk_insert_str.append(val_str)

engine.execute(
    """
    INSERT INTO my_table (column1, column2 ...)
    VALUES {}
    """.format(",".join(bulk_insert_str))
)
Run Code Online (Sandbox Code Playgroud)

虽然很丑陋,但这却给了我所需的性能(〜500,000行/分钟)

您找到基于CORE的解决方案了吗?如果没有,希望对您有所帮助!

更新:最终将我的旧脚本移到了我们未使用的备用EC2实例中,该实例实际上解决了性能降低的问题。不确定您的设置是什么,但是从外部(非AWS)连接与RDS进行通信显然会产生网络开销。

  • 哦,嗯。我试图确保数据安全,并在“插入”周围使用“ sqlalchemy.text()”,然后参数化值(例如“ engine.execute(sqlalchemy.text(insert_str),**参数)”),但是似乎“ sqlalchemy.text()”要花费大量时间...也许要谨慎行事,只是对值打耳光?*恐惧*(要明确:不要批评;这实际上可能是我最好的解决方案。请吓我一跳) (2认同)