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

标签 sqlalchemy flask-sqlalchemy

我有一个相当标准的 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/

相关文章:

python - 更新时重新生成 SQLalchemy 序列

python - Flask-sqlalchemy:如何制作一个可选择按钮来根据用户的角色 ID 选择用户?

python - Flask-sqlalchemy 连接到现有数据库

python - sqlacodegen 不生成任何表

python - sqlalchemy.text 对象的别名

postgresql - Flask-SQLAlchemy 关闭连接

python - 是否可以在 SQLAlchemy 事务中提交两个相关表?

javascript - 如何在html中将一组整数乘以一个字符串?

flask - Shell脚本通过Flask更新数据库

python - SQLAlchemy 最近的日期时间