PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

IntegrityError:membedakan antara batasan unik dan bukan pelanggaran nol

psycopg2 menyediakan SQLSTATE dengan pengecualian sebagai pgcode member, yang memberi Anda informasi kesalahan yang sangat halus untuk dicocokkan.

python3
>>> import psycopg2
>>> conn = psycopg2.connect("dbname=regress")
>>> curs = conn.cursor()
>>> try:
...     curs.execute("INVALID;")
... except Exception as ex:
...     xx = ex
>>> xx.pgcode
'42601'

Lihat Lampiran A:Kode Kesalahan dalam manual PostgreSQL untuk arti kode. Perhatikan bahwa Anda dapat mencocokkan secara kasar pada dua karakter pertama untuk kategori luas. Dalam hal ini saya dapat melihat bahwa SQLSTATE 42601 adalah syntax_error di Syntax Error or Access Rule Violation kategori.

Kode yang Anda inginkan adalah:

23505   unique_violation
23502   not_null_violation

jadi Anda bisa menulis:

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

Yang mengatakan, ini adalah cara yang buruk untuk melakukan upsert atau merge . @pr0gg3d mungkin benar dalam menyarankan cara yang tepat untuk melakukannya dengan Django; Saya tidak melakukan Django jadi saya tidak bisa berkomentar sedikit tentang itu. Untuk info umum tentang upsert/merge lihat artikel depesz tentang topik tersebut.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SELECT DISTINCT lebih lambat dari yang diharapkan di meja saya di PostgreSQL

  2. Cara Mendapatkan Nomor Baris di PostgreSQL

  3. Tabel sementara PostgreSQL

  4. Memiliki Group By Clauses — GeneralBits elein

  5. Waktu postgres dengan kesetaraan zona waktu