जहाँ तक मुझे पता है, एक ही रास्ता है अपवाद में त्रुटि स्ट्रिंग को पार्स करने के लिए। मुझे त्रुटि निर्दिष्ट करने वाले किसी भी tuple, उल्लंघन विशिष्ट विशिष्टता बाधा और मूल्य अलग से नहीं मिल सकता है।
विशेष रूप से, कोई एक सबस्ट्रिंग खोज ऑपरेटर या नियमित अभिव्यक्ति का उपयोग करके अपवाद संदेश खोज सकता है। उदाहरण के लिए:
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 के लिए है। एक mysql अपवाद त्रुटि संदेश को पार्स करना:
(1062, "Duplicate entry 'usr544' for key 'username'")
उचित नियमित अभिव्यक्ति के साथ किया जा सकता है। ध्यान दें कि यह एक tuple की तरह दिखता है, लेकिन यह वास्तव में एक स्ट्रिंग (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। –