Quiero eliminar null = True de un TextField:
- footer=models.TextField(null=True, blank=True)
+ footer=models.TextField(blank=True, default='')
Creé una migración de esquema:
manage.py schemamigration fooapp --auto
Dado que algunas columnas de pie de página contienen NULL
, obtengo esto error
si ejecuto la migración:
django.db.utils.IntegrityError: la columna "pie de página" contiene valores nulos
Agregué esto a la migración del esquema:
for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
sender.footer=''
sender.save()
Ahora obtengo:
django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events
¿Qué está mal?
python
django
postgresql
django-migrations
guettli
fuente
fuente
Respuestas:
Otra razón para esto tal vez sea porque intentas establecer una columna
NOT NULL
cuando ya tieneNULL
valores.fuente
Cada migración está dentro de una transacción. En PostgreSQL no debe actualizar la tabla y luego alterar el esquema de la tabla en una transacción.
Debe dividir la migración de datos y la migración de esquema. Primero cree la migración de datos con este código:
Luego crea la migración del esquema:
Ahora tiene dos transacciones y la migración en dos pasos debería funcionar.
fuente
Acabo de abordar este problema. También puede utilizar db.start_transaction () y db.commit_transaction () en la migración del esquema para separar los cambios de datos de los cambios de esquema. Probablemente no sea tan limpio como para tener una migración de datos separada, pero en mi caso necesitaría un esquema, datos y luego otra migración de esquema, así que decidí hacerlo todo de una vez.
fuente
En las operaciones pongo SET CONSTRAINTS:
fuente
Está alterando el esquema de la columna. Esa columna de pie de página ya no puede contener un valor en blanco. Lo más probable es que ya haya valores en blanco almacenados en la base de datos para esa columna. Django actualizará esas filas en blanco en su base de datos desde el espacio en blanco al valor ahora predeterminado con el comando migrate. Django intenta actualizar las filas donde la columna de pie de página tiene un valor en blanco y cambia el esquema al mismo tiempo que parece (no estoy seguro).
El problema es que no puede modificar el mismo esquema de columna para el que está intentando actualizar los valores al mismo tiempo.
Una solución sería eliminar el archivo de migraciones actualizando el esquema. Luego, ejecute un script para actualizar todos esos valores a su valor predeterminado. Luego, vuelva a ejecutar la migración para actualizar el esquema. De esta forma, la actualización ya está hecha. La migración de Django solo está alterando el esquema.
fuente