據我所知,唯一的辦法就是解析異常中的錯誤字符串。我找不到指定錯誤的任何元組,唯一違反唯一性約束和值的列。
具體而言,可以使用子字符串搜索運算符或正則表達式搜索異常消息。例如:
db.session.add(SupplierUser(supplier_id=supplier_id, username=username, password=password, creator=user))
try:
db.session.commit()
except IntegrityError as err:
db.session.rollback()
if "UNIQUE constraint failed: user.username" in str(err):
return False, "error, username already exists (%s)" % username
elif "FOREIGN KEY constraint failed" in str(err):
return False, "supplier does not exist"
else:
return False, "unknown error adding user"
然而,這些字符串可能會很長,因爲SQL語句包括,例如:
(sqlite3.IntegrityError) UNIQUE constraint failed: user.username [SQL: 'INSERT INTO user (username, password_hash, created_time, creator_id, role, is_active, supplier_id) VALUES (?, ?, ?, ?, ?, ?, ?)'] [parameters: ('bob', ...
因此,你將盡量減少錯誤處理延遲解析例外,如果你通過搜索數據庫錯誤消息,沒有sqlalchemy添加的信息。這可以通過檢查錯誤來完成。ARGS,這應該是更小:
'(sqlite3.IntegrityError) UNIQUE constraint failed: supplier_user.username',)
更新例如:
db.session.add(SupplierUser(supplier_id=supplier_id, username=username, password=password, creator=user))
try:
db.session.commit()
except IntegrityError as err:
db.session.rollback()
err_msg = err.args[0]
if "UNIQUE constraint failed: supplier_user.username" in err_msg:
return False, "error, supplier username already exists (%s)" % username
elif "FOREIGN KEY constraint failed" in err_msg:
return False, "supplier does not exist"
else:
return False, "unknown error adding user"
注意我這裏使用的錯誤語法是sqlite3的。解析mysql異常錯誤消息,如:
(1062, "Duplicate entry 'usr544' for key 'username'")
可以用適當的正則表達式完成。請注意,它看起來像一個元組,但它實際上是一個字符串(sqlalchemy版本1.1.3和mysql 5.5)。
例如:
except IntegrityError as err:
db.session.rollback()
if re.match("(.*)Duplicate entry(.*)for key 'username'(.*)", err.args[0]):
.... etc ....
是的,這是非常有幫助的。 Thx爲我節省了挖掘時間。 – 2016-02-17 19:48:30