2013-02-02 72 views
8

这是正确的吗?我知道第一个会工作,但我怀疑这对DB来说可能比可能需要更多的工作。第二项工作是否会同样如此,但对于数据库而言工作量较少?我正在使用MySQL FWIW。什么时候应该使用for循环提交SQLAlchemy?

for item in items: 
    db.session.add(item) 
    db.session.commit() 

for item in items: 
    db.session.add(item) 
db.session.commit() 
+1

您共执行多少次操作?他们是否资源密集?除非有任何理由,否则你不会在每次之后提交,我不明白你为什么不想总是使用#1。 – woemler

回答

4

我认为你的第二个解决方案是更好,但它取决于你如何配置你的会话。具体来说就是自动刷新和自动提交设置。你也应该使用一个对交易有很好支持的引擎,比如innodb。

假设你有autocommit和autoflush都关闭,那么你会冲刷你的插入到服务器,提交事先的事务,然后创建另一个事务,每次迭代都会在SQLAlchemy和MySQL中创建大量不必要的工作。

我会推荐使用add_all,如果你有一个简单的项目列表添加如你的例子,否则,如果你确实需要循环,那么肯定在循环外应用提交。

http://docs.sqlalchemy.org/en/latest/orm/session.html#sqlalchemy.orm.session.Session.add_all

db.session.add_all(items) 
db.session.commit() 

附加的注释,如果事情是通过循环出问题中途您的交易将回滚只写你之前在回路中这可能是不承诺你想,如果你有什么正在使用交易。例如,如果在循环中途出现错误,则列表中只有一半的项目可能写入数据库。在循环之外调用commit会保证你的循环已经完成并且将被全部提交或者全部回滚。

相关问题