sql >> Database teknologi >  >> RDS >> PostgreSQL

IntegrityError:skelne mellem unikke begrænsninger og ikke null-overtrædelser

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.



  1. Automatiseret eller regelmæssig backup af mysql-data

  2. Få en liste over alle borde i Oracle?

  3. Lær din SQL Server-arbejdsbelastning at kende

  4. Hvad vil det sige at undslippe en streng?