2010-04-10 3 views
6

La maggior parte della mia esperienza con Django finora è stata con MySQL e mysqldb. Per una nuova app che sto scrivendo, sto immergendo l'alluce nell'acqua PostgreSQL, ora che ho seen the light.Che cosa dovrebbe sapere un utente Django quando si passa da MySQL a PostgreSQL?

Durante la scrittura di uno script di importazione dei dati, mi sono imbattuto in un problema con il comportamento di autocommit predefinito. Immagino che ci siano altri "trucchi" che potrebbero emergere. Che altro dovrei essere alla ricerca?

+0

Grazie per avermelo chiesto, stavo considerando di passare a PostgreSQL e avrei incontrato anche qualcuno di questi, ma non sapevo cosa fossero. –

risposta

11

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.