SQLAlchemy 在 FlushError 之后不回滚

SQLAlchemy not rolling back after FlushError

我正在用 python+werkzeug+SQLalchemy 对链接到 MySQL 数据库的 REST API 编写一些测试,其中一项测试是尝试添加 "object" 并且 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()

这是我在 try/except 期间发现的错误:

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 会话和回滚功能的文档,但不明白为什么回滚对我不起作用,因为这几乎是文档中的教科书示例。

我使用 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: 默认情况下,严格模式未激活并允许不正确的 insert/update 在数据库中进行更改(wtf?),解决方案是全局更改 sql_mode: MySQL: Setting sql_mode permanently

或者在 SQLalchemy 中,如本博客中所解释的那样 post: https://www.enricozini.org/blog/2012/tips/sa-sqlmode-traditional/