Django 1.7 - migração não detectando alterações


140

Como o título diz, não consigo fazer as migrações funcionarem.

O aplicativo estava originalmente na versão 1.6, então eu entendo que as migrações não estarão lá inicialmente e, se eu executar python manage.py migrate, recebo:

Operations to perform:
  Synchronize unmigrated apps: myapp
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
  Installing custom SQL...
  Installing indexes...
Running migrations:
  No migrations to apply.

Se eu fizer uma alteração em algum modelo myapp, ele ainda será exibido como migrado, conforme o esperado.

Mas se eu correr python manage.py makemigrations myapp, recebo:

No changes detected in app 'myapp'

Não parece importar o que ou como executo o comando, nunca está detectando o aplicativo como tendo alterações, nem está adicionando arquivos de migração ao aplicativo.

Existe alguma maneira de forçar um aplicativo para migrações e dizer essencialmente "Esta é a minha base para trabalhar" ou algo assim? Ou eu estou esquecendo de alguma coisa?

Meu banco de dados é um PostgreSQL, se é que isso ajuda.


As soluções oferecidas não funcionaram para mim, então aqui está minha solução, se alguém enfrentar o mesmo problema! 1. Exclua os arquivos de migração em todos os aplicativos 2. Exclua o banco de dados e crie-o novamente 3. execute os comandos makemigrations e migrate PS Tente primeiro as etapas 1 e 3. Se ainda houver um erro, siga as etapas de 1 a 3.
Amoroso

Respostas:


187

Se você estiver mudando de um aplicativo existente criado no django 1.6, precisará executar uma pré-etapa (como descobri) listada na documentação:

python manage.py makemigrations your_app_label

A documentação não torna óbvio que você precisa adicionar o rótulo do aplicativo ao comando, pois a primeira coisa que ele solicita é python manage.py makemigrationsque falhe. A migração inicial é feita quando você cria seu aplicativo na versão 1.7, mas se você veio da 1.6, ele não teria sido realizado. Consulte 'Adicionando migração para aplicativos' na documentação para obter mais detalhes.


1
Boa resposta para quem vem do Django 1.6! Obrigado!
David D.

1
E se eu tiver muito mais de um aplicativo? Devo ter que python manage.py makemigrations APP_LABELpara cada um?
Alston

1
Sob Django 1.9 aqui e meu aplicativo foi criado com ./manage.py startapp, mas eu ainda tinha que mencionar explicitamente o rótulo
maxbellec

50

Isso pode acontecer devido aos seguintes motivos:

  1. Você não adicionou o aplicativo na INSTALLED_APPSlista settings.py (é necessário adicionar o nome do aplicativo ou o caminho pontilhado à subclasse de AppConfig em apps.py na pasta do aplicativo, dependendo da versão do django que você está usando). Consulte a documentação: INSTALLED_APPS
  2. Você não tem migrationspasta dentro desses aplicativos. (Solução: basta criar essa pasta).
  3. Você não possui um __init__.pyarquivo dentro da migrationspasta desses aplicativos. (Solução: basta criar um arquivo vazio com o nome __init__.py )
  4. Você não tem um __init__.pyarquivo dentro da pasta do aplicativo. (Solução: basta criar um arquivo vazio com o nome __init__.py )
  5. Você não tem um models.pyarquivo no aplicativo
  6. Sua classe Python (supostamente um modelo) models.pynão herdadjango.db.models.Model
  7. Você tem algum erro semântico na definição de modelos em models.py

Nota: Um erro comum é adicionar uma migrationspasta no .gitignorearquivo. Quando clonadas do repositório remoto, migrationspastas e / ou __init__.pyarquivos estarão ausentes no repositório local. Isso causa problema.

Sugiro que gitignore os arquivos de migração adicionando as seguintes linhas ao .gitignorearquivo

*/migrations/*
!*/migrations/__init__.py

1
Eu tinha clonado meu projeto e a pasta de migrações não foi enviada para o repositório, então tive que adicionar o diretor de migrações, depois adicionei o init .py e pude fazer migrações. Obrigado a você
Junaid

Excluí o conteúdo da minha pasta / migrations para "redefinir" as coisas em um projeto que ainda não havia implantado. Excluí inadvertidamente a __init__.pypasta junto com as migrações.
Seth

Isso fez isso por mim .... You don't have __init__.py file inside migrations folder of those apps. (Solution: Just create an empty file with name __init__.py).. e ele foi causado por adicionar os arquivos para.gitignore
lukik

1
Por que o arquivo init .py é tão importante na pasta de migrações? fazer migrações? Onde posso aprofundar essa lógica?
Nimish Bansal

1
O arquivo @NimishBansal Till python 3.3 __init__.pyé necessário dentro de um diretório para tratá-lo como um pacote python. veja isso
Mohammed Shareef C

29

Ok, parece que eu perdi uma etapa óbvia, mas postando isso no caso de alguém fazer o mesmo.

Ao atualizar para o 1.7, meus modelos se tornaram não gerenciados ( managed = False) - eu os tinha como Trueantes, mas parece que ele foi revertido.

A remoção dessa linha (para o padrão True) e a execução makemigrationsimediata criaram um módulo de migração e agora está funcionando. makemigrationsnão funcionará em tabelas não gerenciadas (o que é óbvio em retrospectiva)


4
Esclareça: onde você alterou / adicionou "managed = False"? Estou tendo o mesmo problema
Ycon 30/10/2015

1
Eu não tenho mais esse código, mas penso como uma propriedade da classe se bem me lembro.
TyrantWave

1
Bom ponto. Observe que manage.py inspectdbadiciona manage = False! no caso de importar bancos de dados herdados, você deve ajustá-lo com cuidado!
Alessandro Dentella

@TyrantWave, você salvou meu dia. Muito obrigado.
Utkarsh Sharma

verifique se o seu app_labelé o mesmo
Luv33preet

19

Minha solução não foi abordada aqui, por isso estou publicando. Eu estava usando syncdbpara um projeto - apenas para colocá-lo em funcionamento. Então, quando tentei começar a usar as migrações do Django, ele as falsificou no começo e depois dizia que estava 'OK', mas nada estava acontecendo com o banco de dados.

Minha solução foi apenas excluir todos os arquivos de migração para o meu aplicativo, bem como os registros do banco de dados para as migrações de aplicativos na django_migrationstabela.

Então eu fiz uma migração inicial com:

./manage.py makemigrations my_app

Seguido por:

./manage.py migrate my_app

Agora eu posso fazer migrações sem problemas.


FYI: é fundamental que ele diga aqui "os arquivos e os registros do banco de dados". Se você remover os registros do banco de dados mas não os ficheiros bem (exceto para __init.py__, não vai funcionar.
Mike Robinson

15

Concorde com @furins. Se tudo estiver em ordem e ainda assim esse problema surgir, verifique se existe algum método de propriedade com o mesmo título que o atributo que você está tentando adicionar na classe Model.

  1. Remova o método com nome semelhante ao atributo que você está adicionando.
  2. manage.py makemigrations my_app
  3. manage.py migrar my_app
  4. Adicione os métodos de volta.

11

Esse é um erro estúpido de cometer, mas ter uma vírgula extra no final da linha de declaração de campo na classe model, faz com que a linha não tenha efeito.

Isso acontece quando você copia e cola o def. da migração, que é definida como uma matriz.

Embora talvez isso ajude alguém :-)


1
Seu comentário me ajudou a encontrar meu problema! Eu não tinha vírgula no final da última escolha em uma lista de opções .. aparentemente o Django é muito sensível.
Maxim

1
@ Maxim: que era improvável a causa do seu problema: uma lista sem vírgula no final ainda é uma lista. Outra questão são as tuplas: se você tiver apenas 1 elemento em uma tupla, precisará de uma vírgula depois dele.
precisa saber é o seguinte

cara que me salvou muito tempo! @ dangonfast: na definição do modelo, é realmente um problema.
MRE

11

Talvez eu esteja atrasado, mas você tentou ter uma migrationspasta no seu aplicativo com um __init__.pyarquivo?


1
Se você tiver esse "makemigrations", criará as migrações para o aplicativo. Caso contrário, será necessário que você executar makemigrations app_name (que cria estes arquivos)
Scott Warren

7

Talvez isso ajude alguém. Eu estava usando um aplicativo aninhado. project.appname e eu realmente tinha project e project.appname em INSTALLED_APPS. A remoção do projeto de INSTALLED_APPS permitiu que as alterações fossem detectadas.


7

A resposta está nesta postagem de stackoverflow, por cdvv7788 Migrations in Django 1.7

Se for a primeira vez que você estiver migrando esse aplicativo, precisará usar:

manage.py makemigrations myappname Depois de fazer isso, você pode:

manage.py migrate Se você tinha seu aplicativo no banco de dados, modificou seu modelo e não atualiza as alterações nas migrações de empresa, provavelmente ainda não o migrou. Mude o seu modelo de volta à sua forma original, execute o primeiro comando (com o nome do aplicativo) e migre ... ele será falso. Depois de fazer isso, adie as alterações no seu modelo, execute makemigrations e migre novamente e ele deverá funcionar.

Eu estava tendo exatamente o mesmo problema e as opções acima funcionaram perfeitamente.

Mudei meu aplicativo django para cloud9 e, por algum motivo, nunca peguei a migração inicial.


7

A seguir trabalhou para mim:

  1. Adicione o nome do aplicativo a settings.py
  2. use 'python manage.py makemigrations'
  3. use 'python manage.py migrate'

Trabalhou para mim: Python 3.4, Django 1.10


6

Pessoas como eu que não gostam de migrações podem usar as etapas abaixo.

  1. Remova as alterações que você deseja sincronizar.
  2. Execute python manage.py makemigrations app_labelpara a migração inicial.
  3. Execute python manage.py migratepara criar tabelas antes de fazer alterações.
  4. Cole as alterações que você remove na primeira etapa.
  5. Execute as etapas 2. e 3..

Se você confundiu alguma dessas etapas, leia os arquivos de migração. Altere-os para corrigir seu esquema ou remover arquivos indesejados, mas não esqueça de alterar a parte das dependências do próximo arquivo de migração;)

Espero que isso ajude alguém no futuro.


5

Você deseja verificar o settings.pyna INSTALLED_APPSlista e garantir que todos os aplicativos com modelos estão listados lá.

A execução makemigrationsna pasta do projeto significa que ele atualizará todas as tabelas relacionadas a todos os aplicativos incluídos no settings.pyprojeto. Depois de incluí-lo, makemigrationso aplicativo será incluído automaticamente (isso economiza muito trabalho, para que você não precise executar makemigrations app_nametodos os aplicativos do seu projeto / site).


5

Apenas no caso de você ter um campo específico que não seja identificado pelas migrações: verifique duas vezes se você possui uma propriedade com o mesmo nome.

exemplo:

field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)

# ... later

@property
def field(self):
    pass

a propriedade substituirá a definição do campo para que as alterações não sejam identificadas por makemigrations


Uma chatice relacionada é ter um campo mal formado que ainda escapa da validação / verificação. Eu defini hourly_rate = models.DecimalField(faltando o final '()') e ele simplesmente falhou silenciosamente.
sáb

5

Verifique se o seu modelo não é abstract. Na verdade, cometi esse erro e demorou um pouco, então pensei em publicá-lo.


4

Adicionando esta resposta porque somente esse método me ajudou.

Eu apaguei a migrationspasta run makemigrationse migrate.
Ainda dizia: Não há migrações para aplicar.

Eu fui para a migratepasta e abri o último arquivo criado,
comente a migração que eu queria (foi detectada e inserida lá)
e execute migratenovamente.

Isso basicamente edita o arquivo de migrações manualmente.
Faça isso apenas se você entender o conteúdo do arquivo.


1
Muito obrigado! Isso ajudou
Sharpless512

3

Você usou schemamigration my_app --initialdepois de renomear a pasta de migração antiga? Tente. Pode funcionar. Caso contrário - tente recriar o banco de dados e faça com que o syncdb + migre. Funcionou para mim ...


10
Nenhum comando schemamigrationexiste - acho que faz parte do sul? Atualmente, não tenho uma pasta de migração. Remover minha models.pye executar novamente inspectdbnão parecia fazer nada.
TyrantWave

2
schemamigrationera do sul. makemigrationsé o seu substituto.
Craig Labenz

2
Isso ainda é válido. Mas mudou paramakemigrations --empty
Iulius Curt

2

Teve o mesmo problema Verifique se quaisquer classes que você definiu em models.py, você deve herdar a classe models.Model.

class Product(models.Model):
    title = models.TextField()
    description = models.TextField()
    price = models.TextField()

1

Eu tive o mesmo problema em ter que executar migrações migratórias duas vezes e todo tipo de comportamento estranho. A raiz do problema foi que eu estava usando uma função para definir datas padrão nos meus modelos, de modo que as migrações detectavam uma alteração toda vez que eu fazia migrações. A resposta a esta pergunta me colocou no caminho certo: Evite que as migrações migrem para recriar o campo de data


1

Atualizei recentemente o Django de 1.6 para 1.8 e tinha poucos aplicativos e migrações para eles. Eu usei o sul e schemamigrationspara criar migrações no Django 1.6, que é descartado no Django 1.8.

Quando adicionei novos modelos após a atualização, o makemigrationscomando não estava detectando nenhuma alteração. E então eu tentei a solução sugerida por @drojf (1ª resposta), funcionou bem, mas não conseguiu aplicar a migração inicial falsa ( python manage.py --fake-initial). Eu estava fazendo isso porque minhas tabelas (tabelas antigas) já foram criadas.

Finalmente, isso funcionou para mim, removeu novos modelos (ou alterações de modelo) de models.py e, em seguida, tive que excluir (ou renomear para pasta de migrações de backup de segurança) de todos os aplicativos e executar manage.pymakemigrations python para todos os aplicativos python manage.py migrate --fake-initial. Isso funcionou como um encanto. Depois que a migração inicial é criada para todos os aplicativos e a migração inicial falsa é adicionada, adicionamos novos modelos e seguimos o processo regular makemigrationse migramos nesse aplicativo. As alterações foram detectadas agora e tudo correu bem.

Eu apenas pensei em compartilhá-lo aqui, se alguém enfrentar o mesmo problema (tendo schemamigrationsdo sul para seus aplicativos), isso poderá ajudá-los :)


1

Talvez isso possa ajudar alguém, eu tive o mesmo problema.

Eu já criei duas tabelas com a classe serializador e as visualizações. Então, quando eu quis atualizar, tive esse erro.

Eu segui estas etapas:

  1. Eu fiz .\manage.py makemigrations app
  2. Eu executei .\manage.py migrate
  3. Eu apaguei as duas tabelas do meu models.py
  4. Eu apaguei todas as referências às minhas tabelas do serializador e da classe view.
  5. Eu executei o passo 1e 2.
  6. Eu recuperei minhas alterações apenas no models.py
  7. Eu executei novamente o passo 5.
  8. Eu restaurei todas as minhas alterações.

Se você trabalha com Pycharm, o histórico local é muito útil.


1

Talvez isso ajude alguém.

Excluí meu models.pye esperava makemigrationscriar DeleteModelinstruções.

Lembre-se de excluir *.pycarquivos!


1
./manage makemigrations
./manage migrate

As migrações controlam as alterações no banco de dados; portanto, se você estiver mudando de não gerenciado para gerenciado, precisará verificar se a tabela do banco de dados está atualizada em relação ao modelo com o qual está lidando.

Se você ainda estiver no modo dev, eu pessoalmente decidi excluir os arquivos de migração no meu IDE e também na tabela django_migrations relacionada ao meu Model e execute novamente o comando acima.

LEMBRE-SE: se você tiver uma migração que termina com _001 no seu IDE e _003 no seu banco de dados. O Django verá apenas se você possui uma migração terminada com _004 para atualizar alguma coisa.

Os 2 (migrações de código e banco de dados) estão vinculados e funcionam em conjunto.

Feliz codificação.


1
  1. Remova as alterações que você deseja sincronizar.
  2. Execute python manage.py makemigrations app_label para a migração inicial.
  3. Execute python manage.py migrate para criar tabelas antes de fazer alterações.
  4. Cole as alterações que você remove na primeira etapa.
  5. Execute as etapas 2. e 3.

0

Adicionamos esta resposta porque nenhum dos outros disponíveis acima funcionou para mim.

No meu caso, algo ainda mais estranho estava acontecendo ( Django 1.7 Versão ), no meu models.py eu tinha uma linha "extra" no final do meu arquivo (era uma linha em branco) e quando executei o python manage.py makemigrationscomando, o resultado foi: "nenhuma alteração detectada".

Para corrigir isso, excluí essa "linha em branco" que estava no final do meu arquivo models.py e executei o comando novamente, tudo foi corrigido e todas as alterações feitas no models.py foram detectadas!


Bem no Django 2.0 + que linha vazia é exigido eu acredito, eu tinha que fazer o oposto do que você fez amigo
Sumit Kumar Saha

@SumitKumarSaha haha ​​Estou atualmente usando a versão Django 1.7 e essa linha em branco foi o motivo de 2 horas tentando de tudo para resolver o erro de migração. Obrigado por compartilhar Sumit. Tenha um bom dia
Huskie

0

Pode ser necessário falsificar as migrações iniciais usando o comando abaixo

python manage.py migrate --fake-initial

0

Primeiro, esta solução é aplicável àqueles que enfrentam o mesmo problema durante a implantação no servidor heroku, eu estava enfrentando o mesmo problema.

Para implantar, há uma etapa obrigatória que é adicionar django_heroku.settings (locals ()) no arquivo settings.py.

Alterações: Quando mudei a linha acima para django_heroku.settings (locals (), database = False), funcionou perfeitamente.


0

No meu caso, eu precisei adicionar meu modelo ao arquivo _ init _.py da pasta models em que meu modelo foi definido:

from myapp.models.mymodel import MyModel

-1

Adicionando meu 2c, já que nenhuma dessas soluções funcionou para mim, mas isso funcionou ...

Eu tinha acabado de correr manage.py squashmigrations e remover as migrações antigas (os arquivos e as linhas na tabela do banco de dados django.migrations).

Isso deixou uma linha como esta no último arquivo de migração:

replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]

Isso aparentemente confundiu o Django e causou um comportamento estranho: a execução manage.py makemigrations my_apprecriaria a migração inicial como se não existisse. A remoção da replaces...linha corrigiu o problema!


-1

python manage.py makemigrations accounts Migrações para 'accounts': accounts \ migrations \ 0001_initial.py - Criar modelo Cliente - Criar modelo Tag - Criar modelo Tag - Criar modelo Produto - Criar modelo Pedido

Nota: aqui "contas" é o nome do meu aplicativo

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.