哪个是对的?我知道第一个会起作用,但我怀疑数据库的工作量比可能需要的要多。第二个工作是否同样有效,但对数据库的工作更少?我正在使用 MySQL FWIW。
for item in items:
db.session.add(item)
db.session.commit()
或者
for item in items:
db.session.add(item)
db.session.commit()
哪个是对的?我知道第一个会起作用,但我怀疑数据库的工作量比可能需要的要多。第二个工作是否同样有效,但对数据库的工作更少?我正在使用 MySQL FWIW。
for item in items:
db.session.add(item)
db.session.commit()
或者
for item in items:
db.session.add(item)
db.session.commit()
我认为您的第二个解决方案更好,但这取决于您如何配置会话。特别是自动刷新和自动提交设置。此外,您应该使用对事务有良好支持的引擎,例如 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 可以保证您的循环已经完成并且将全部提交或全部回滚。
添加解决方案:这是使用 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([user1, user2])
你可以使用这个:
session.bulk_save_objects([User, User, Permission])