これまでのDjangoでの私の経験のほとんどは、MySQLとmysqldbでした。私が書いている新しいアプリでは、光を見たので、PostgreSQLの水につま先を浸しています。
データインポートスクリプトを書いているときに、デフォルトの自動コミット動作の問題に遭遇しました。他にも発生する可能性のある「落とし穴」があると思います。他に何に注意する必要がありますか?
これまでのDjangoでの私の経験のほとんどは、MySQLとmysqldbでした。私が書いている新しいアプリでは、光を見たので、PostgreSQLの水につま先を浸しています。
データインポートスクリプトを書いているときに、デフォルトの自動コミット動作の問題に遭遇しました。他にも発生する可能性のある「落とし穴」があると思います。他に何に注意する必要がありますか?
Djangoの自動コミットとデフォルトのPostgreSQLコミットモードの間に矛盾があります。
箱から出して、DjangoはデフォルトのPostgreSQLモード「readcommited」を使用します。これは、すべての操作を単一のトランザクションに結合し、dbカーソルがスコープ外になると終了します。この一連の操作中にエラーが発生すると、問題が発生します。Postgresは、続行する前にロールバックを発行することを想定しています。発行しない場合、次に接続を使用するときにpsycopg2はInternalErrorをスローします。Djangoの自動コミット(デフォルト)に依存している場合は、おそらく適切にロールバックすることはできません。
幸い、psycopg2は、これらのトランザクションを設定しない「自動コミット」と呼ばれる別の操作モードをサポートしています。MySQLから来ている(または両方をサポートしようとしている)人にとって、これは世界にいくらかの正気をもたらします。1.1では、それを公開するためのサポートが追加されました。以下を設定に追加します(トランクを使用している場合は、 1.2構文に変更する必要があります)
DATABASE_OPTIONS = {
"autocommit": True,
}
Djangoチケット#3460のディスカッションでは、詳細が説明されています。