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 ?


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 .


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 ).

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

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.


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.


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


0

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.