6

これまでのDjangoでの私の経験のほとんどは、MySQLとmysqldbでした。私が書いている新しいアプリでは、光を見たので、PostgreSQLの水につま先を浸しています。

データインポートスクリプトを書いているときに、デフォルトの自動コミット動作の問題に遭遇しました。他にも発生する可能性のある「落とし穴」があると思います。他に何に注意する必要がありますか?

4

1 に答える 1

11

Djangoの自動コミットとデフォルトのPostgreSQLコミットモードの間に矛盾があります。

箱から出して、DjangoはデフォルトのPostgreSQLモード「readcommited」を使用します。これは、すべての操作を単一のトランザクションに結合し、dbカーソルがスコープ外になると終了します。この一連の操作中にエラーが発生すると、問題が発生します。Postgresは、続行する前にロールバックを発行することを想定しています。発行しない場合、次に接続を使用するときにpsycopg2はInternalErrorをスローします。Djangoの自動コミット(デフォルト)に依存している場合は、おそらく適切にロールバックすることはできません。

幸い、psycopg2は、これらのトランザクションを設定しない「自動コミット」と呼ばれる別の操作モードをサポートしています。MySQLから来ている(または両方をサポートしようとしている)人にとって、これは世界にいくらかの正気をもたらします。1.1では、それを公開するためのサポートが追加されました。以下を設定に追加します(トランクを使用している場合は、 1.2構文に変更する必要があります)

DATABASE_OPTIONS = {
    "autocommit": True,
}

Djangoチケット#3460のディスカッションでは、詳細が説明されています。


于 2010-04-10T18:06:54.047 に答える