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

标签 python mysql sqlalchemy

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

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

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

最佳答案

我认为您的第二个解决方案更好,但这取决于您如何配置 session 。特别是自动刷新和自动提交设置。此外,您应该使用对事务有良好支持的引擎,例如 innodb。

假设您同时关闭了 autocommit 和 autoflush,那么您将把插入刷新到服务器,提交之前的事务,然后在每次迭代时创建另一个事务,这在 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 可以保证你的循环已经完成并且将全部提交或全部回滚。

关于python - 我什么时候应该使用 for 循环提交 SQLAlchemy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14665834/

相关文章:

python - 使用 MySQLdb 的 SQLAlchemy 双正斜杠问题

python - 消除部分匹配的 Pandas 数据框行

python - 从离散信号计算FFT特征

python - 如何将分隔值转换为one-hot编码列?

php - opencart 电子商务网站的首字节时间非常长

python - SQLAlchemy MySQL 时间戳列值

python - 如果识别出汽车拍照

mysql查询2个带循环值的表

MySQL : Get lastest updated row from 2 tables?

python - 如何在python中使用sqlalchemy和sqlite增加连接超时