SQLAlchemy在FlushError之后没有回滚

问题描述 投票:0回答:1

我正在使用python + werkzeug + SQLalchemy为一个链接到MySQL数据库的REST API编写一些测试,其中一个测试是尝试添加一个“对象”,其中json中缺少主键并验证它是否失败并且没有不要在DB中插入任何内容。它曾经与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':实例具有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!

谢谢你的帮助

python mysql orm sqlalchemy werkzeug
1个回答
0
投票

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

或者在SQLalchemy中,就像在这篇博文中解释的那样:https://www.enricozini.org/blog/2012/tips/sa-sqlmode-traditional/

© www.soinside.com 2019 - 2024. All rights reserved.