C'è una incoerenza tra l'autocommit di Django e la modalità di commit PostgreSQL predefinita.
All'inizio, Django utilizza la modalità PostgreSQL predefinita "read committed" che combina tutte le operazioni in una singola transazione che termina quando il cursore db esce dall'ambito. Il problema sorge quando si verifica un errore durante quella serie di operazioni. Postgres si aspetta che tu esegua un rollback prima di continuare, e se non lo fai, psycopg2 lancia un InternalError la prossima volta che usi la connessione. Se ti affidi al comando automatico Django (predefinito), probabilmente non eseguirai il rollback correttamente.
Fortunatamente, psycopg2 supporta un'altra modalità operativa denominata "autocommit" in cui non imposta queste transazioni. Per quelli che provengono da MySQL (o provando a supportare entrambi), ciò porta un po 'di sanità mentale al mondo. In 1.1 hanno aggiunto il supporto per esporlo. Aggiungere la seguente alle impostazioni (deve essere cambiato per 1.2 syntax se siete su tronco)
DATABASE_OPTIONS = {
"autocommit": True,
}
La discussione i biglietti per Django #3460 delinea i dettagli grintosi.
Grazie per avermelo chiesto, stavo considerando di passare a PostgreSQL e avrei incontrato anche qualcuno di questi, ma non sapevo cosa fossero. –