通过 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 似乎不是最理想的。