sql >> データベース >  >> RDS >> PostgreSQL

IntegrityError:一意性制約とnull以外の違反を区別する

    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の記事を参照してください。



    1. 19データベース設計エラーについて学ぶためのオンラインリソース

    2. 次のSELECT式で列エイリアスを使用できないのはなぜですか?

    3. JSON_PRETTY()–MySQLで読みやすくするためにJSONドキュメントをフォーマットする

    4. LOAD_FILEを使用してファイルをMySQLBLOBにロードする方法は?