Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么时候应该使用for循环提交SQLAlchemy?_Python_Mysql_Sqlalchemy - Fatal编程技术网

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

Python 什么时候应该使用for循环提交SQLAlchemy?,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,哪个是正确的?我知道第一个会起作用,但我怀疑对DB来说,这比可能需要的工作要多。第二种方法是否同样有效,但DB的工作量会减少?我正在使用MySQL FWIW for item in items: db.session.add(item) db.session.commit() 或 我认为您的第二个解决方案更好,但这取决于您如何配置会话。特别是自动刷新和自动提交设置。您还应该使用对事务有良好支持的引擎,例如innodb 假设您同时关闭了autocommit和autoflush,那

哪个是正确的?我知道第一个会起作用,但我怀疑对DB来说,这比可能需要的工作要多。第二种方法是否同样有效,但DB的工作量会减少?我正在使用MySQL FWIW

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


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

假设您同时关闭了autocommit和autoflush,那么您将刷新对服务器的插入,提交之前的事务,然后在每次迭代中创建另一个事务,这将在SQLAlchemy和MySQL中创建大量不必要的工作

如果您有一个简单的项目列表要添加(如示例中所示),我建议使用add_all,否则如果您确实需要循环,那么一定要在循环之外应用commit


另一个注意事项是,如果在循环的某个部分出错,那么您的事务将只回滚对循环中先前提交的写操作,如果您正在使用事务,这可能不是您想要的。例如,如果循环中途发生错误,则列表中只有一半的项可能会写入数据库。而在循环外调用commit可以保证循环已完成,并且将全部提交或全部回滚。

要添加到解决方案中,请使用add_ALL()

使用“添加行”而不是“添加行”

session.add_all([user1, user2])
你可以用这个:


session.bulk\u save\u对象([User,User,Permission])

您总共执行了多少个操作?它们是资源密集型的吗?除非你有任何理由不想在每次之后提交,否则我不明白你为什么不想总是使用#1.+1来指出add#u all。有些令人沮丧的是,sql_炼金术文档没有以某种入门页面的形式出现在这篇文章的前面和中心…@adam hughes在文章中提到了这一点。我认为sqlalchemy有太多的深度,很容易让人不知所措。
db.session.add_all(items)
db.session.commit()
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])