如何独立于数据库/引擎捕获错误1062“重复条目”?

10 投票
2 回答
19384 浏览
提问于 2025-04-17 05:59

在我开始的一个项目中,我使用了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是否支持这些代码。

撰写回答