据我所知,唯一的方法是解析异常中的错误字符串。我找不到任何指定错误的元组、违反唯一性约束的列和值。
具体来说,可以使用子字符串搜索运算符或正则表达式来搜索异常消息。例如:
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 添加信息。这可以通过检查 err.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 ....