SQLAlchemy核心大容量插入

2024-04-26 20:51:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用SQLAlchemy截断一个表,只插入大约3000行数据,而且速度非常慢(大约10分钟)。在

我遵循了关于这个doc的建议,并利用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
            )

Tags: 数据数据库利用核心executedatadocsqlalchemy
2条回答

不久前,我在公司工作时一直在为这个问题而努力,所以我们创建了一个库,其中包含了批量插入和更新的功能。希望我们已经考虑了所有的性能和安全问题。这个库是开源的,在PyPI上可用,它的名称:bulky。在

我来给你举几个用法的例子:

插入:

import bulky
from your.sqlalchemy.models import Model
from your.sqlalchemy.session import Session

data = [
    {Model.column_float: random()}
    for _ in range(100_000_000)
]

rows_inserted = bulky.insert(
    session=Session,
    table_or_model=Model,
    values_series=data,
    returning=[Model.id, Model.column_float]
)

new_items = {row.id: row.column_float for row in rows_inserted}

更新:

^{pr2}$

不确定是否允许链接,所以我会把它们放在扰流板下面

Readme and PyPI

当我看到这个没有答案的时候我很沮丧。。。前几天我遇到了完全相同的问题:尝试使用CORE向postgresrds实例大容量插入大约数百万行。这花了小时。在

作为一种解决方法,我最终编写了自己的大容量插入脚本,该脚本本身生成了原始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))
)

虽然很难看,但这给了我所需的性能(大约500000行/分钟)

你找到基于核心的解决方案了吗?如果没有,希望这有帮助!在

更新:最后把我的旧脚本移到一个备用的EC2实例中,这个实例实际上解决了性能慢的问题。不确定您的设置是什么,但显然在通过外部(非AWS)连接与RDS通信时会有网络开销。在

相关问题 更多 >