sql >> Databáze >  >> RDS >> PostgreSQL

IntegrityError:rozlišujte mezi jedinečným omezením a nenulovým porušením

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.



  1. Odesílání e-mailů s přílohami v SQL Server (T-SQL)

  2. Seřadit posledních N řádků v databázi?

  3. Humanizované nebo přirozené třídění smíšených slovních a číselných řetězců

  4. Maximální velikost databáze SQLite v aplikaci pro Android