sqlmigrate migrations inspectdb inconsistent exceptions cancel python django postgresql django-migrations

python - inspectdb - Django-DB-Migrations: no se puede ALTERAR TABLA porque tiene eventos desencadenantes pendientes



sqlmigrate django (3)

Acabo de golpear este problema También puede usar db.start_transaction () y db.commit_transaction () en la migración de esquema para separar los cambios de datos de los cambios de esquema. Probablemente no esté 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.

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

Como algunas columnas de pie de página contienen NULL, obtengo este error si ejecuto la migración:

django.db.utils.IntegrityError: column "footer" contains null values

Agregué esto a la migración de esquema:

for sender in orm[''fooapp.EmailSender''].objects.filter(footer=None): sender.footer='''' sender.save()

Ahora entiendo:

django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events

¿Qué está mal?


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 crea la migración de datos con este código:

for sender in orm[''fooapp.EmailSender''].objects.filter(footer=None): sender.footer='''' sender.save()

Luego crea la migración del esquema:

manage.py schemamigration fooapp --auto

Ahora tiene dos transacciones y la migración en dos pasos debería funcionar.


Otra razón para esto puede deberse a que intenta establecer una columna en NOT NULL cuando en realidad ya tiene valores NULL .