如何独立于数据库/引擎捕获错误1062“重复条目”?
在我开始的一个项目中,我使用了MySQL作为数据库。最开始我没有先检查数据,而是直接进行插入操作。如果出现了一个叫做IntegrityError的错误,错误代码是1062,那我就知道有重复的记录了,然后就可以提醒用户去做一些事情。
这段代码大致是这样的:
try:
# add duplicate, nothing bad happens yet, is only in sqla session
db.session.add(User(email='already_used_email@address_that_has_to_be_unique.com'))
# commit, now the IntegrityError is raised, when sqla inserts
db.session.commit()
except IntegrityError as e:
db.session.rollback()
# this is what i do with mysql, check the exception for code 1062
# how can i replace this with something db independent?
code, msg = e.orig
if code == 1062:
# send warning
pass
不过,这样做有个问题,就是我无法使用像内存中的sqlite这样的测试工具。虽然这不太好,但我可以勉强接受。
更重要的是,我可能需要(或者想要,因为其他问题)切换到Postgres数据库。当然,我可以修改代码,去检查Postgres的错误代码,但我希望能有一种方法,让SQLAlchemy能够独立于数据库告诉我是否发生了重复记录。也就是说,能有一种数据库方言的抽象方式……?
2 个回答
0
如果你使用的是 pymysql
,那么你可以这样做。
except pymysql.err.IntegrityError:
db_connection.rollback() # rollback
return jsonify({"message":"DUPLICATE"}), 400 # just json return
这个链接是 pymysql.err
的 GitHub 代码。你可以在这里找到 其他异常
的信息!https://github.com/PyMySQL/PyMySQL/blob/main/pymysql/err.py
4
你想要查找的是一种叫做“SQLSTATE”的东西——这是一组标准的错误代码,涵盖了大多数常见的关系数据库管理系统(RDBMS)错误状态。不过,这些错误代码可能并不能提供足够的细节来满足所有需求,而且我不确定sqlite是否支持这些代码。