Quero remover null = True de um TextField:
- footer=models.TextField(null=True, blank=True)
+ footer=models.TextField(blank=True, default='')
Eu criei uma migração de esquema:
manage.py schemamigration fooapp --auto
Como algumas colunas de rodapé contêm, NULL
eu entendi error
se executar a migração:
django.db.utils.IntegrityError: a coluna "footer" contém valores nulos
Eu adicionei isso à migração do esquema:
for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
sender.footer=''
sender.save()
Agora eu consigo:
django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events
O que está errado?
python
django
postgresql
django-migrations
Guettli
fonte
fonte
Respostas:
Outra razão para isso pode ser porque você tenta definir uma coluna para
NOT NULL
quando, na verdade, ela já temNULL
valores.fonte
Cada migração está dentro de uma transação. No PostgreSQL você não deve atualizar a tabela e então alterar o esquema da tabela em uma transação.
Você precisa dividir a migração de dados e a migração de esquema. Primeiro crie a migração de dados com este código:
Em seguida, crie a migração do esquema:
Agora você tem duas transações e a migração em duas etapas deve funcionar.
fonte
Acabei de atingir este problema. Você também pode usar db.start_transaction () e db.commit_transaction () na migração do esquema para separar as mudanças de dados das mudanças de esquema. Provavelmente não tão limpo a ponto de ter uma migração de dados separada, mas no meu caso eu precisaria de esquema, dados e outra migração de esquema, então decidi fazer tudo de uma vez.
fonte
Nas operações eu coloquei SET CONSTRAINTS:
fonte
Você está alterando o esquema da coluna. Essa coluna de rodapé não pode mais conter um valor em branco. Provavelmente, existem valores em branco já armazenados no BD para essa coluna. Django irá atualizar essas linhas em branco em seu banco de dados de branco para o valor padrão agora com o comando migrate. Django tenta atualizar as linhas onde a coluna do rodapé tem um valor em branco e alterar o esquema ao mesmo tempo que parece (não tenho certeza).
O problema é que você não pode alterar o mesmo esquema de coluna para o qual está tentando atualizar os valores ao mesmo tempo.
Uma solução seria excluir o arquivo de migração atualizando o esquema. Em seguida, execute um script para atualizar todos esses valores para o valor padrão. Em seguida, execute novamente a migração para atualizar o esquema. Dessa forma, a atualização já está feita. A migração do Django está apenas alterando o esquema.
fonte