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

Djangoがpostgresqlでシリアル化可能なトランザクション分離レベルを使用している場合のシリアル化の失敗を表す特定の例外は何ですか?

    うーん、いい質問です。ドキュメントでは、適切な例外は TransactionManagementError

    ただし、ソースコード そうではないという強い手がかりを与えます:

    class TransactionManagementError(ProgrammingError):
        """Transaction management is used improperly."""
        pass
    

    これは ProgrammingErrorであることに注意してください。 、これは実際にプログラマーのエラーを示すために使用されます(つまり、「不適切に使用された」)。

    psycopg(PostgreSQLサポートに使用されるPythonアダプター)のドキュメントを見ると、 psycopg2.extensions.TransactionRollbackError

    しかし、Djangoはそれで何をしますか?ええと、ここに記載されている 、標準のPython DB API 2.0例外を同等のDjangoでラップし、 __ cause __を設定します。 元の例外の属性。したがって、以下はおそらくあなたが行うことができる最も具体的なチェックです:

    from django.db import OperationalError
    from psycopg2.extensions import TransactionRollbackError
    
    for retries in range(0, 3):
        try:
            with transaction.atomic():
                MyModel.objects.update(foo='bar')
        except OperationalError as e:
            if e.__cause__.__class__ == TransactionRollbackError:
                continue
            else:
                raise            
        else:
            break
    

    PostgreSQLによって公開されたエラーの詳細に応じて(eから入手可能.__cause__。diag )さらに具体的なテストを書くことができるかもしれません。

    ただし、一般的に、Python DB API 2.0のドキュメントには、OperationalErrorと記載されています。 は確かにトランザクションの問題の正しい例外タイプであるため、それをキャッチすることは、データベースに依存しない合理的に効果的なソリューションになることを願っています。




    1. 日時の日付部分だけに一意の制約を作成する方法は?

    2. MySQLで文字セットをlatin1からUTF8に変更する方法

    3. MySQLマルチテーブル結合

    4. コードを別のサーバーに移動すると、mysql_real_escape_stringが機能しなくなりました