django syncdb e um modelo atualizado

86

Recentemente, atualizei meu modelo, adicionei um BooleanField a ele, mas quando o faço python manage.py syncdb, ele não adiciona o novo campo ao banco de dados do modelo. Como posso consertar isso ?

Hellnar
fonte
17
O fato de o Django não suportar uma coisa tão fundamental fora da caixa me impediu de usá-lo para criar modelos. O fato de eles considerarem um ORM que lida com a criação de tabelas, mas não com a modificação de tabelas (in-loco) como qualidade de lançamento quase me impediu de usar o Django inteiramente.
Glenn Maynard,
3
O fato de o Django permitir uma grande capacidade de plug-in do aplicativo torna o Django incrível e torna sua falta de suporte integrado para modificação de tabelas basicamente irrelevante. Quão difícil é instalar um aplicativo?
Dominic Rodger,
@Glenn, planeje seus modelos adequadamente durante a fase de design e você não terá esse problema. Se você estiver adicionando novos recursos, use um pacote de migração como o South. As migrações locais são frequentemente complicadas; muito complicado para um comando simples de gerenciamento do Django.
Soviut

Respostas:

100

Do Django 1.7 em diante

Django tem suporte embutido para migrações - dê uma olhada na documentação .

Para Django 1.6 e anteriores

Django não suporta migrações prontas para uso. Existe um aplicativo plugável para Django que faz exatamente isso, e funciona muito bem. Chama-se Sul .

Dominic Rodger
fonte
1
Nota: Tive problemas ao usar o South para migrar modelos com um back-end db personalizado (como django-mssql)
Don
1
Sul é muito, muito bom! Obrigado pela dica
Julien Greard
14

Django atualmente não faz isso automaticamente. Suas opções são:

  1. Elimine a tabela do banco de dados e recrie-a em um novo formato usando o syncdb.
  2. Imprima SQL para o banco de dados usando python manage.py sql (appname), encontre a linha adicionada para o campo e adicione-a manualmente usando o alter tablecomando SQL. (Isso também permitirá que você escolha os valores do campo para seus registros atuais.)
  3. Use o Sul (de acordo com a resposta de Dominic ).
che
fonte
11

Siga esses passos:

  1. Exporte seus dados para um aparelho usando o comando de gerenciamento dumpdata
  2. Largue a mesa
  3. Execute syncdb
  4. Recarregue seus dados do aparelho usando o comando loaddata management
Soviut
fonte
Descarte e recarregue completamente para algo que deve ser feito no local? Isso é terrível.
Glenn Maynard,
3
É um comando de gerenciamento simples, não um pacote de migração! Django não tem como prever como seus dados mudaram ou como preservá-los, então ele insiste que você mesmo faça isso. Se você não gosta, use uma ferramenta de migração como a South.
Soviut,
8

Conforme sugerido na resposta principal, tentei usar o South e, após uma hora de frustração com erros de migração obscuros, decidi usar o Django Evolution .

Acho que é mais fácil começar do que o South, e funcionou perfeitamente na primeira vez que digitei ./manage.py evolve --hint --execute, então estou feliz com isso.

Dan Abramov
fonte
7
Depois de usar Django Evolution and South por quase um ano, estou mudando de opinião. O sul é incrível. Mas é muito parecido com o Git no sentido de que você precisa ter certeza de que realmente entende como ele funciona . Se você estiver digitando comandos às cegas, provavelmente vai errar na primeira vez que você ou alguém de sua equipe cometer um erro.
Dan Abramov
2

Não usei o django por um tempo, mas pareço lembrar que o syncdb executa comandos alter nas tabelas db. você tem que largar a tabela e executar novamente e ela será criada novamente.

editar: desculpe, NÃO realiza alteração.

Alex H
fonte
Então não está executando alter tablecomandos, está executando create tablecomandos.
Dominic Rodger,
bom eu tenho dados no db então seria ótimo se eu superasse esse problema sem cair.
Hellnar,
1
Eu acho que você queria dizer que o syncdb NÃO executa comandos de alteração. Você não precisa descartar a tabela, você pode adicionar manualmente o novo campo ao seu sql também.
Odif Yltsaeb,
sim, mas a questão estava se referindo ao uso do syncdb, então neste caso você teria que descartar a tabela para usar o syncdb ou usar o plugin mencionado abaixo.
Alex H,
1
Se você está frustrado com o South, tente o Django Evolution. Funcionou bem para mim. stackoverflow.com/questions/1605662/…
Dan Abramov
1

Em Django 1.6

  • No início, corremos - python manage.py sql <app name>

  • Então temos que correr - python manage.py syncdb

Monwara Hossain Munni
fonte
0

Se você executa o Django com Apache e MySQL, reinicie o apache após fazer a migração com makemigrations .

Felipe perry
fonte