SQLAlchemy的原始SQL VS表达式语言语句(SQLAlchemy raw sql vs e

2019-07-30 20:56发布

当通过SQLA-表达语言的语句,FE将在MySQL-DB多行

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

it's的极端缓慢,相对于一个“原始”的SQL语句的执行完成同样的任务,即

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

,这是什么原因呢? 不容SQLA产生一个BULK INSERT语句,因此执行多个插入? 由于ORM的速度极限,我需要一个快速的方法来一次添加几千行,但SQLA-表达语言,版本是太慢了。 所以,我需要我自己写的原始SQL? 该文档是不是太清楚这一点。

我跑与ORM刀片的速度测试,用预先指定的PK和SQLA批量插入的ORM(见SQLA批量插入速度 )这样的( https://gist.github.com/3341940 ):

  • SQLAlchemy的ORM:总时间为500个记录9.61418914795秒
  • SQLAlchemy的ORM PK给出:总时间为500个记录9.56391906738秒
  • SQLAlchemy的核心:总时间为500记录9.5362598896秒
  • SQLAlchemy的原始字符串执行:总时间为500个记录1.233677秒

正如你所看到的,实际上是三个版本没有任何区别。 只有原始字符串插入,所有的记录都包含在原始SQL语句的执行是显著更快。 因此,对于快速插入,SQLA似乎次优的。

Answer 1:

这似乎与多个值的特殊衬垫不仅成为最新支持(0.8未发行),你可以在这部分的底部看到关于executemany之间的差异和多值INSERT(什么用列表来做到执行)的说明:

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

这应该解释一下你看到的性能差异。 你可以尝试安装的开发版本,并重复改变了其调用语法测试,在链接中提到,确认。



文章来源: SQLAlchemy raw sql vs expression language statements