我什么时候应该使用for循环提交SQLAlchemy?

Mar*_*ark 15 python mysql sqlalchemy

哪个是对的?我知道第一个会工作,但我怀疑它对数据库的工作比可能需要的更多.第二个工作是否同样可行,但DB的工作量较少?我正在使用MySQL FWIW.

for item in items:
    db.session.add(item)
    db.session.commit()
Run Code Online (Sandbox Code Playgroud)

要么

for item in items:
    db.session.add(item)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)

Ian*_*son 9

我认为您的第二个解决方案更好,但这取决于您如何配置会话.特别是autoflush和autocommit设置.此外,您应该使用对交易有良好支持的引擎,例如innodb.

假设您已经自动提交并自动刷新,那么您将刷新插入服务器,提交先前的事务,然后在每次迭代时创建另一个事务,这会在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()
Run Code Online (Sandbox Code Playgroud)

另外需要注意的是,如果某些内容在循环中出错,那么您的事务将仅回滚写入循环中的先前提交,如果您使用事务,则可能不是您想要的.例如,如果在循环中途发生错误,则列表中只有一半的项可能会写入数据库.而在循环外调用commit会保证循环已完成,并且将全部提交或全部回滚.