当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我什么时候应该使用for循环提交SQLAlchemy?》经验,为你挑选了1个好方法。

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

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

要么

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

Ian Wilson.. 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()

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



1> Ian Wilson..:

我认为您的第二个解决方案更好,但这取决于您如何配置会话.特别是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()

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

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有