Flo*_*ian 9 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
Run Code Online (Sandbox Code Playgroud)
现在,对于一个,这使得已经无法用例如测试.内存中的sqlite.不好,但我可以忍受.
然而,第二,我可能(必须/希望其他超出此问题的范围)切换到Postgres.当然我可以更改代码(也)检查Postgres错误代码,但我希望有一种方法让SQLALchemy告诉我,一个重复发生独立于数据库.数据库方言抽象......?
似乎很容易:
try:
cursor.execute(query)
conn.commit()
except MySQLdb.IntegrityError as e:
if not e[0] == 1062:
raise
else:
print "MY ERROR 1062: " + e[1]
Run Code Online (Sandbox Code Playgroud)
深入研究MySQLdb模块的connections.py我发现它引发了一个错误类和一个错误值.所以你可以让你的try语句捕获所需的类,然后使用条件来处理错误值1062否则,继续引发错误..
connections.py
defaulterrorhandler(connection, cursor, errorclass, errorvalue):
....
....
raise errorclass, errorvalue
Run Code Online (Sandbox Code Playgroud)
您想要搜索的是名为“SQLSTATE”的内容 - 一组涵盖最常见 RDBMS 错误状态的标准错误代码。不过,它们不一定为所有目的提供足够的详细信息,而且我不知道 sqlite 是否支持它们。
| 归档时间: |
|
| 查看次数: |
13246 次 |
| 最近记录: |