psycopg2 giver SQLSTATE
med undtagelsen som pgcode
medlem, hvilket giver dig ret finkornede fejlinformationer at matche på.
python3
>>> import psycopg2
>>> conn = psycopg2.connect("dbname=regress")
>>> curs = conn.cursor()
>>> try:
... curs.execute("INVALID;")
... except Exception as ex:
... xx = ex
>>> xx.pgcode
'42601'
Se Bilag A:Fejlkoder i PostgreSQL-manualen for kodebetydninger. Bemærk, at du kan matche groft på de to første tegn for brede kategorier. I dette tilfælde kan jeg se, at SQLSTATE 42601 er syntax_error
i Syntax Error or Access Rule Violation
kategori.
Koderne du ønsker er:
23505 unique_violation
23502 not_null_violation
så du kunne skrive:
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
Når det er sagt, er dette en dårlig måde at lave en upsert
på eller merge
. @pr0gg3d har formodentlig ret i at foreslå den rigtige måde at gøre det på med Django; Jeg laver ikke Django, så jeg kan ikke kommentere det. For generel info om upsert/merge se depesz's artikel om emnet.