gpt4 book ai didi

sqlalchemy - Flask-SQLAlchemy:如何在不触发数据库提交的情况下调用 db.create_all() 和 db.drop_all()?

转载 作者:行者123 更新时间:2023-12-01 23:13:16 30 4
gpt4 key购买 nike

我有一个相当标准的 Flask-SQLAlchemy 设置连接到 PostgreSQL 9.4 数据库。

出于测试目的,我想调用 db.create_all()在数据库事务范围内,运行我的测试,然后调用 db.drop_all() --all 不提交该数据库事务。这是可能的,因为 PostgreSQL 将 DDL 包装在事务中。

然而,每当我打电话db.create_all()db.drop_all() , Flask-SQLAlchemy 发出 COMMIT在创建每个单独的表之后。同样,它发出 COMMIT在删除每个表之后。

我有 COMMIT_ON_TEARDOWN = True ,但 AFAIK 这应该只对最终提交很重要——它不应该导致在每个表之后发生中间提交。

如何更改此行为,以便在不自动触发数据库提交的情况下创建或删除表?

最佳答案

看起来 sqlalchemy 使用 autocommit = True 实现了 create_all() 所以可能没有办法改变这种行为。

相关代码:
https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/engine/base.py#L199

https://github.com/zzzeek/sqlalchemy/blob/859379e2fcc4506d036700ba1eca4c0ae526a8ee/lib/sqlalchemy/sql/ddl.py#L60

更新:

对于不支持嵌套事务的 MySQL,我的回答是正确的 ==> https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html .
正如@Jeff Widman 在他的回答中提到的,有一种方法可以为 PostgreSQL 做到这一点,“通过将全局 session 替换为在嵌套事务中运行的 session ”

关于sqlalchemy - Flask-SQLAlchemy:如何在不触发数据库提交的情况下调用 db.create_all() 和 db.drop_all()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34410091/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com