哪个是对的?我知道第一个会工作,但我怀疑它对数据库的工作比可能需要的更多.第二个工作是否同样可行,但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会保证循环已完成,并且将全部提交或全部回滚.
我认为您的第二个解决方案更好,但这取决于您如何配置会话.特别是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会保证循环已完成,并且将全部提交或全部回滚.