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

时间:2011-11-09 22:17:07

标签: python mysql postgresql sqlalchemy

在一个项目中,我开始使用MySQL作为数据库。我只是做一个插入而不是先检查,如果我得到一个代码为1062的IntegrityError异常,我知道有一个重复的条目并警告用户,要做到这一点。

看起来基本上是这样的:

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 :(得分:6)

似乎很容易:

try:
    cursor.execute(query)
    conn.commit()
except MySQLdb.IntegrityError as e:
    if not e[0] == 1062:
        raise
    else:
        print "MY ERROR 1062: " + e[1]

深入研究MySQLdb模块的connections.py我发现它引发了一个错误类和一个错误值。所以你可以让你的try语句捕获所需的类,然后使用条件来处理错误值1062否则,继续引发错误..

connections.py

defaulterrorhandler(connection, cursor, errorclass, errorvalue):
    ....
    ....
    raise errorclass, errorvalue

答案 1 :(得分:3)

您要搜索的内容称为“SQLSTATE” - 一组标准错误代码,涵盖了大多数常见的RDBMS错误状态。但它们并不一定能为所有目的提供足够的细节,我不知道sqlite是否支持它们。