在一个项目中,我开始使用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告诉我,一个重复发生独立于数据库。数据库方言抽象......?答案 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是否支持它们。