通过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):
如您所见,三个版本之间几乎没有区别。只执行原始字符串插入,其中所有记录都包含在原始sql语句中明显更快。因此,对于快速插入,SQLA似乎是次优的。
答案 0 :(得分:2)
似乎最近只支持具有多个值的特殊INSERT(0.8未发布),您可以在本节底部看到有关executemany(使用列表执行的内容)与多值之间的区别的注释INSERT:
这应该可以解释您看到的性能差异。您可以尝试安装开发版本并使用链接中提到的更改的调用语法重复测试以确认。