我正在使用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!
谢谢你的帮助
看起来问题只是MYSQL:默认情况下,严格模式没有激活,允许不正确的插入/更新在数据库中进行更改(wtf?),解决方案是全局更改sql_mode:MySQL: Setting sql_mode permanently
或者在SQLalchemy中,就像在这篇博文中解释的那样:https://www.enricozini.org/blog/2012/tips/sa-sqlmode-traditional/