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