10

通过 SQLA-Expression-Language 语句在 MySQL-DB 中插入多行时,fe

Foo.__table__.insert().execute([{'bar': 1}, {'bar': 2}, {'bar': 3}])

与为同一任务执行“原始” sql 语句相比,它非常慢,即

engine.execute("insert into foo (bar) values (1),(2),(3)")

这是什么原因?SQLA 不能生成单个批量插入语句并因此执行多个插入吗?由于 orm 的速度限制,我需要一种快速的方法来一次添加几千行,但是 SQLA-Expression-Language-Version 太慢了。那么,我需要自己编写原始 sql 吗?文档对此并不太清楚。

我使用 ORM 插入、带有预分配 PK 的 ORM 和 SQLA 批量插入(参见SQLA 批量插入速度)进行了速度测试,如下所示(https://gist.github.com/3341940):

  • SqlAlchemy ORM:500 条记录的总时间 9.61418914795 秒
  • SqlAlchemy ORM pk 给出:500 条记录的总时间 9.56391906738 秒
  • SqlAlchemy Core:500 条记录的总时间 9.5362598896 秒
  • SQLAlchemy RAW 字符串执行:500 条记录的总时间 1.233677 秒

如您所见,这三个版本之间几乎没有区别。仅执行原始字符串插入,其中所有记录都包含在原始 sql 语句中,速度明显更快。因此,对于快速插入,SQLA 似乎不是最理想的。

4

1 回答 1

2

似乎最近才支持具有多个值的特殊 INSERT(0.8 未发布),您可以在本节底部看到关于 executemany(使用列表执行的操作)和多值插入之间的区别的注释:

http://docs.sqlalchemy.org/ru/latest/core/expression_api.html#sqlalchemy.sql.expression.Insert.values

这应该可以解释您看到的性能差异。您可以尝试安装开发版本并使用链接中提到的更改的调用语法重复测试以确认。

于 2013-02-06T06:08:06.130 回答