psycopg2 menyediakan SQLSTATE
dengan pengecualian sebagai pgcode
member, yang memberi Anda informasi kesalahan yang sangat halus untuk dicocokkan.
python3
>>> import psycopg2
>>> conn = psycopg2.connect("dbname=regress")
>>> curs = conn.cursor()
>>> try:
... curs.execute("INVALID;")
... except Exception as ex:
... xx = ex
>>> xx.pgcode
'42601'
Lihat Lampiran A:Kode Kesalahan dalam manual PostgreSQL untuk arti kode. Perhatikan bahwa Anda dapat mencocokkan secara kasar pada dua karakter pertama untuk kategori luas. Dalam hal ini saya dapat melihat bahwa SQLSTATE 42601 adalah syntax_error
di Syntax Error or Access Rule Violation
kategori.
Kode yang Anda inginkan adalah:
23505 unique_violation
23502 not_null_violation
jadi Anda bisa menulis:
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
Yang mengatakan, ini adalah cara yang buruk untuk melakukan upsert
atau merge
. @pr0gg3d mungkin benar dalam menyarankan cara yang tepat untuk melakukannya dengan Django; Saya tidak melakukan Django jadi saya tidak bisa berkomentar sedikit tentang itu. Untuk info umum tentang upsert/merge lihat artikel depesz tentang topik tersebut.