SQLAlchemy原始sql vs表达式语言语句

时间:2012-08-09 16:30:46

标签: insert sqlalchemy bulkinsert

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

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插件,ORM预先分配的PK和SQLA批量插入(请参阅SQLA bulk insert speed)进行了速度测试(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似乎是次优的。

1 个答案:

答案 0 :(得分:2)

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

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

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