2010-04-10 11 views
6

La mayor parte de mi experiencia con Django hasta ahora ha sido con MySQL y mysqldb. Para una nueva aplicación que estoy escribiendo, estoy sumergiendo mi dedo del pie en el agua PostgreSQL, ahora que tengo seen the light.¿Qué debería saber un usuario de Django al pasar de MySQL a PostgreSQL?

Mientras escribía un script de importación de datos, tropecé con un problema con el comportamiento de autocommit predeterminado. Yo diría que hay otros "errores" que podrían surgir. ¿Qué más debería estar buscando?

+0

Gracias por preguntar esto: estaba considerando mudarme a PostgreSQL y me habría encontrado con alguno de estos también, pero no sé cuáles eran. –

Respuesta

11

Existe una incoherencia entre el compromiso automático de Django y el modo de compromiso predeterminado de PostgreSQL.

Fuera de la caja, Django usa el modo PostgreSQL predeterminado "read committed" que combina todas las operaciones en una sola transacción que finaliza cuando el cursor db sale del alcance. El problema surge cuando ocurre un error durante esa serie de operaciones. Postgres espera que usted emita un rollback antes de continuar, y si no lo hace, psycopg2 lanza un InternalError la próxima vez que vaya a usar la conexión. Si confía en el autocompromiso de Django (el valor predeterminado), es probable que no retroceda correctamente.

Afortunadamente, psycopg2 tiene soporte para otro modo de operación llamado "autocommit" en el que no establece estas transacciones. Para aquellos que provienen de MySQL (o que intentan apoyar a ambos), esto trae cordura al mundo. En 1.1 agregaron soporte para exponerlo. Añadir lo siguiente a su configuración (necesita ser cambiado para 1.2 syntax si estás en el tronco)

DATABASE_OPTIONS = { 
    "autocommit": True, 
} 

La discusión para el boleto Django #3460 expone los detalles arenosos.


Cuestiones relacionadas