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

时间:2013-02-02 19:53:03

标签: python mysql sqlalchemy

哪个是对的?我知道第一个会工作,但我怀疑它对数据库的工作比可能需要的更多。第二个工作是否同样可行,但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()

3 个答案:

答案 0 :(得分:8)

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

添加解决方案:这是使用add_all()

的方法
user1 = User(name='user1')
user2 = User(name='user2')
session.add(user1)
session.add(user2)

session.commit()     # write changes to the database

而不是使用两个添加行

session.add_all([item1, item2, item3])

答案 2 :(得分:0)

您可以使用此:

this.intervalId = setInterval(() => this.sendIntervalMessage(), this.timeUntilSendMessages); //time here is 3000