psycopg2 biedt de SQLSTATE
met uitzondering van de pgcode
lid, wat je vrij fijnmazige foutinformatie geeft om op te matchen.
python3
>>> import psycopg2
>>> conn = psycopg2.connect("dbname=regress")
>>> curs = conn.cursor()
>>> try:
... curs.execute("INVALID;")
... except Exception as ex:
... xx = ex
>>> xx.pgcode
'42601'
Zie Bijlage A:Foutcodes in de PostgreSQL-handleiding voor codebetekenissen. Merk op dat je grof kunt matchen op de eerste twee tekens voor brede categorieën. In dit geval kan ik zien dat SQLSTATE 42601 is syntax_error
in de Syntax Error or Access Rule Violation
categorie.
De codes die u wilt zijn:
23505 unique_violation
23502 not_null_violation
zodat je zou kunnen schrijven:
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
Dat gezegd hebbende, dit is een slechte manier om een upsert
te doen of merge
. @pr0gg3d heeft vermoedelijk gelijk in het suggereren van de juiste manier om het met Django te doen; Ik doe geen Django, dus daar kan ik geen commentaar op geven. Voor algemene informatie over upsert/merge, zie het artikel van depesz over dit onderwerp.