psycopg2 SQLSTATE
प्रदान करता है pgcode
. के अपवाद के साथ सदस्य, जो आपको मिलान करने के लिए काफी बारीक त्रुटि जानकारी देता है।
python3
>>> import psycopg2
>>> conn = psycopg2.connect("dbname=regress")
>>> curs = conn.cursor()
>>> try:
... curs.execute("INVALID;")
... except Exception as ex:
... xx = ex
>>> xx.pgcode
'42601'
देखें परिशिष्ट A:त्रुटि कोड कोड अर्थ के लिए PostgreSQL मैनुअल में। ध्यान दें कि आप व्यापक श्रेणियों के लिए पहले दो वर्णों पर मोटे तौर पर मिलान कर सकते हैं। इस मामले में मैं देख सकता हूँ कि SQLSTATE 42601 syntax_error
. है Syntax Error or Access Rule Violation
. में श्रेणी।
आप जो कोड चाहते हैं वे हैं:
23505 unique_violation
23502 not_null_violation
ताकि आप लिख सकें:
try:
principal = cls.objects.create(
user_id=user.id,
email=user.email,
path='something'
)
except IntegrityError as ex:
if ex.pgcode == '23505':
principal = cls.objects.get(
user_id=user.id,
email=user.email
)
else:
raise
उस ने कहा, यह upsert
करने का एक बुरा तरीका है या merge
. @ pr0gg3d संभवतः Django के साथ इसे करने का सही तरीका सुझाने में सही है; मैं Django नहीं करता इसलिए मैं उस पर टिप्पणी नहीं कर सकता। अप्सर्ट/मर्ज के बारे में सामान्य जानकारी के लिए इस विषय पर डिपेज़ का लेख देखें।