O banco de dados de destino não está atualizado


104

Eu gostaria de fazer uma migração para um aplicativo Flask. Estou usando o Alembic.

No entanto, recebo o seguinte erro.

Target database is not up to date.

Online, li que tem algo a ver com isso. http://alembic.zzzcomputing.com/en/latest/cookbook.html#building-an-up-to-date-database-from-scratch

Infelizmente, eu não entendo muito bem como atualizar o banco de dados e onde / como devo escrever o código fornecido no link. Se você tem experiência com migrações, pode me explicar isso

obrigado

Respostas:


109

Depois de criar uma migração, manualmente ou como --autogenerate, você deve aplicá-la com alembic upgrade head. Se você usou db.create_all()em um shell, pode usar alembic stamp headpara indicar que o estado atual do banco de dados representa a aplicação de todas as migrações.


72

Isso funcionou para mim

$ flask db stamp head
$ flask db migrate
$ flask db upgrade

39

Minha avaliação é como esta pergunta, quando eu executo "./manage.py db migrate -m 'Adicionar relacionamento'", o erro ocorreu como este "alembic.util.exc.CommandError: Banco de dados de destino não está atualizado."

Portanto, verifiquei o status da minha migração:

(venv) ]#./manage.py db heads
d996b44eca57 (head)
(venv) ]#./manage.py db current
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
715f79abbd75

e descobri que as cabeças e a corrente são diferentes!

Consertei seguindo estas etapas:

(venv)]#./manage.py db stamp heads
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running stamp_revision 715f79abbd75 -> d996b44eca57

E agora a corrente é a mesma para a cabeça

(venv) ]#./manage.py db current
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
d996b44eca57 (head)

E agora posso fazer a migração novamente.


Funciona como um encanto ! Acho que essa é a melhor maneira de lidar com esse problema!
attaboyabhipro

O mesmo aqui! Trabalhou suavemente. Eu sabia que tinha a ver com db heads e current, mas não sabia que existe o comando "stamp". Obrigado!
Subspacian

13

Isso pode ser resolvido de várias maneiras:

1 Para corrigir esse erro, exclua o arquivo de migração mais recente (um arquivo python) e tente realizar uma nova migração.

Se o problema ainda persistir, tente estes comandos:

$ flask db stamp head  # To set the revision in the database to the head, without performing any migrations. You can change head to the required change you want.
$ flask db migrate     # To detect automatically all the changes.
$ flask db upgrade     # To apply all the changes.

9

Tive que excluir alguns dos meus arquivos de migração por algum motivo. Não sei por quê. Mas isso resolveu o problema, mais ou menos.

Um problema é que o banco de dados acaba sendo atualizado corretamente, com todas as novas tabelas, etc, mas os próprios arquivos de migração não mostram nenhuma alteração quando eu uso a migração automática.

Se alguém tiver uma solução melhor, por favor me avise, pois agora minha solução é meio hacky.


Eu sei que está um pouco velho agora, mas suas tabelas herdam do Base? Eu tive o mesmo problema e a migração automática não estava pegando alterações devido ao fato de que minhas novas tabelas não estavam herdando de Base onde a base está Base = declarative_base() e também lembre-sefrom sqlalchemy.ext.declarative import declarative_base

7
$ flask db stamp head  # To set the revision in the database to the head, without performing any migrations. You can change head to the required change you want.
$ flask db migrate  # To detect automatically all the changes.
$ flask db upgrade  # To apply all the changes.

Você pode encontrar mais informações na documentação https://flask-migrate.readthedocs.io/en/latest/


2

Também encontrei cabeças diferentes e queria mudar um dos campos de string para inteiro, então primeiro execute:

$ flask db stamp head # to make the current the same
$ flask db migrate
$ flask db upgrade

Está resolvido agora!


1

Isso também pode acontecer se você, como eu, acabou de iniciar um novo projeto e está usando o banco de dados SQLite em memória ( sqlite:///:memory:). Se você aplicar uma migração em tal banco de dados, obviamente da próxima vez que você quiser dizer auto-gerar uma revisão, o banco de dados ainda estará em seu estado original (vazio), então o alambique reclamará que o banco de dados de destino não está à altura encontro. A solução é mudar para um banco de dados persistente.


0

Para corrigir esse erro, exclua o arquivo de migração mais recente (um arquivo python) e tente realizar uma nova migração.



-6

Para resolver isso, eu descarto (excluo) as tabelas na migração e executo esses comandos

flask db migrate

e

flask db upgrade
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.