psycopg2はSQLSTATE
を提供します pgcode
としての例外を除いて メンバー。これにより、一致する非常にきめ細かいエラー情報が得られます。
python3
>>> import psycopg2
>>> conn = psycopg2.connect("dbname=regress")
>>> curs = conn.cursor()
>>> try:
... curs.execute("INVALID;")
... except Exception as ex:
... xx = ex
>>> xx.pgcode
'42601'
付録A:エラーコードを参照してください。 コードの意味については、PostgreSQLのマニュアルを参照してください。幅広いカテゴリの最初の2つの文字を大まかに一致させることができることに注意してください。この場合、SQLSTATE42601がsyntax_error
であることがわかります。 Syntax Error or Access Rule Violation
カテゴリ。
必要なコードは次のとおりです:
23505 unique_violation
23502 not_null_violation
だからあなたは書くことができます:
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
とはいえ、これはupsert
を行うには悪い方法です。 またはmerge
。 @ pr0gg3dは、おそらくDjangoでそれを行う正しい方法を提案するのに正しいでしょう。私はDjangoをやっていないので、そのビットについてコメントすることはできません。アップサート/マージに関する一般的な情報については、このトピックに関するdepeszの記事を参照してください。