SQLAlchemy在FlushError之后没有回滚

时间:2018-02-27 14:10:52

标签: python mysql orm sqlalchemy werkzeug

我正在使用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()

这是我在try / except期间捕获的错误:

  

class'narlalchemy.orm.exc.FlushError':Instance具有NULL标识密钥。如果这是自动生成的值,请检查数据库表是否允许生成新的主键值,以及映射的Column对象是否配置为期望这些生成的值。还要确保此flush()没有在不适当的时间发生,例如在load()事件中。

我刚刚阅读了有关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!

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

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

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