gpt4 book ai didi

python - SQLAlchemy 在 FlushError 后不会回滚

转载 作者:行者123 更新时间:2023-11-29 17:54:08 24 4
gpt4 key购买 nike

我正在使用 python+werkzeug+SQLalchemy 对链接到 MySQL 数据库的 REST API 编写一些测试,其中一个测试是尝试添加 json 中缺少主键的“对象”并验证它失败并且不会在数据库中插入任何内容。它曾经与 sqlite 一起工作正常,但我切换到 MySQLdb,现在我得到一个 FlushError (而不是我以前捕获的 IntegrityError ),当我尝试在错误后回滚时,它不会抛出任何错误,但条目位于主键设置为“”的数据库。代码如下所示:

    session = Session()
try:
res = func(*args, session=session, **kwargs)
session.commit()
except sqlalchemy.exc.SQLAlchemyError as e:
session.rollback()
return abort(422)
else:
return res
finally:
session.close()

这是我在尝试/异常(exception)期间捕获的错误:

class 'sqlalchemy.orm.exc.FlushError':Instance has a NULL identity key. If this is an auto-generated value, check that the database table allows generation of new primary key values, and that the mapped Column object is configured to expect these generated values. Ensure also that this flush() is not occurring at an inappropriate time, such as within a load() event.

我刚刚阅读了有关 SQLalchemy session 和回滚功能的文档,但不明白为什么回滚对我不起作用,因为这几乎是文档中的教科书示例。

我使用Python 2.7.13、werkzeug'0.12.2'、sqlalchemy'1.​​1.13'和MySQLdb'1.2.3'以及mysql Ver 14.14 Distrib 5.1.73!

感谢您的帮助

最佳答案

看来问题仅出在 MYSQL 上:默认情况下,严格模式未激活,并允许错误的插入/更新在数据库中进行更改(wtf?),解决方案是全局更改 sql_mode: MySQL: Setting sql_mode permanently

或者在 SQLalchemy 中,如本博客文章中所述: https://www.enricozini.org/blog/2012/tips/sa-sqlmode-traditional/

关于python - SQLAlchemy 在 FlushError 后不会回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49010687/

24 4 0