sql >> Database >  >> RDS >> PostgreSQL

IntegrityError:onderscheid maken tussen unieke beperking en niet-nulschendingen

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.



  1. SQLite TOON TABELLEN Equivalent

  2. Open source-gegevens worden volwassen:kiezen voor MySQL, NoSQL of beide

  3. LEFT OUTER JOIN of RIGHT OUTER JOIN vinden met ORACLE JOIN (+)

  4. Verbinding maken met een database met behulp van de Workbench MySQL-client