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.

TyrantWave
fonte
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.

drojf
fonte
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
Mohammed Shareef C
fonte
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)

TyrantWave
fonte
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.

Grant Eagon
fonte
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.
Prashant Nair
fonte
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 :-)

Iman Akbari
fonte
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?

rrrub
fonte
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.

jaywhy13
fonte
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.

MicahT
fonte
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

Pranshu Gupta
fonte
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.

Deniz Kaplan
fonte
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).

Pegajoso
fonte
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

furins
fonte
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.

Marca
fonte
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.

Jithin Pavithran
fonte
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 ...

Alex Vidis
fonte
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()
Sonu Kumar
fonte
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

PhoebeB
fonte
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 :)

RaghavHarpale
fonte
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.

impressões digitais
fonte
1

Talvez isso ajude alguém.

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

Lembre-se de excluir *.pycarquivos!

Sebastian Wagner
fonte
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.

AH Bensiali
fonte
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.
Vijay Choudhary
fonte
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!

Huskie
fonte
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
dtar
fonte
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.

Rishabh Aher
fonte
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
Robert Wallace
fonte
-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!

webtweakers
fonte
-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

Vijay Choudhary
fonte