psycopg2 poskytuje SQLSTATE
s výjimkou pgcode
člen, což vám poskytuje poměrně jemné informace o chybách, se kterými se můžete shodovat.
python3
>>> import psycopg2
>>> conn = psycopg2.connect("dbname=regress")
>>> curs = conn.cursor()
>>> try:
... curs.execute("INVALID;")
... except Exception as ex:
... xx = ex
>>> xx.pgcode
'42601'
Viz Příloha A:Kódy chyb v příručce PostgreSQL pro významy kódu. Všimněte si, že pro široké kategorie můžete hrubě porovnat první dva znaky. V tomto případě vidím, že SQLSTATE 42601 je syntax_error
v Syntax Error or Access Rule Violation
kategorie.
Požadované kódy jsou:
23505 unique_violation
23502 not_null_violation
takže můžete napsat:
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
To znamená, že toto je špatný způsob, jak provést upsert
nebo merge
. @pr0gg3d má pravděpodobně pravdu, když navrhuje správný způsob, jak to udělat s Django; Nedělám Django, takže se k tomu nemůžu vyjádřit. Obecné informace o upsert/merge naleznete v depeszově článku na toto téma.