、唯一の方法があります例外のエラー文字列を解析します。私はエラーを指定したタプル、違反した一意性制約と値を別々に持つ列を見つけることができません。
具体的には、部分文字列検索演算子または正規表現を使用して例外メッセージを検索できます。たとえば:
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からの追加情報なしで、データベース・エラー・メッセージ。これは誤りを調べることによって行うことができます。小さくなければならない引数、:
'(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のためであることに注意してください。
(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それは私にそれを掘る時間を節約するために。 –