Цільова база даних не оновлена


101

Я хотів би здійснити міграцію для програми Flask. Я використовую Alembic.

Однак я отримую таку помилку.

Target database is not up to date.

В Інтернеті я читав, що це пов’язано з цим. http://alembic.zzzcomputing.com/en/latest/cookbook.html#building-an-up-to-date-database-from-scratch

На жаль, я не зовсім розумію, як оновити базу даних і де / як слід писати код, вказаний у посиланні. Якщо у вас є досвід міграції, чи можете ви пояснити це мені?

Дякую

Відповіді:


104

Після створення міграції, вручну або як --autogenerate, ви повинні застосувати її за допомогою alembic upgrade head. Якщо ви використовували db.create_all()з оболонки, ви можете використовувати, alembic stamp headщоб вказати, що поточний стан бази даних представляє застосування всіх міграцій.



38

Моя постановка схожа на це запитання. Коли я виконую "./manage.py db migrate -m 'Додати взаємозв'язок'", помилка сталася, як ця "alembic.util.exc.CommandError: Цільова база даних не оновлена."

Тож я перевірив статус міграції:

(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

і виявив, що голови і струм різні!

Я виправив це, виконавши такі дії:

(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

І тепер струм такий самий для голови

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

І тепер я можу зробити міграцію знову.


Працює як шарм! Я вважаю, що це найкращий спосіб вирішити цю проблему!
attaboyabhipro

Те ж саме! Працювали гладко. Я знав, що це пов'язано з db-головками та струмом, але не знав, що існує команда "штамп". Дякую!
Subspacian

10

Це можна вирішити за допомогою багатьох способів:

1 Щоб виправити цю помилку, видаліть останній файл міграції (файл python), а потім спробуйте виконати міграцію заново.

Якщо проблема не зникає, спробуйте виконати ці команди:

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

8

З якихось причин мені довелося видалити деякі файли міграції. Не знаю, чому. Але це вирішило проблему.

Одне питання полягає в тому, що база даних в кінцевому підсумку оновлюється належним чином, з усіма новими таблицями тощо, але самі файли міграції не відображають жодних змін, коли я використовую automigrate.

Якщо хтось має краще рішення, будь ласка, дайте мені знати, оскільки зараз моє рішення є якимсь хакі.


Я знаю, що зараз він трохи старий, але чи ваші таблиці успадковуються від Base? У мене була та сама проблема, і automigrate не збирав змін через те, що мої нові таблиці не успадковувались від бази, де знаходиться база, Base = declarative_base() а також пам'ятаюfrom 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.

Ви можете знайти більше інформації в документації https://flask-migrate.readthedocs.io/en/latest/


2

Я занадто стикався з різними головками, і я хотів змінити одне з полів із рядка на ціле, тому спочатку запустіть:

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

Зараз це вирішено!


1

Це також може статися, якщо ви, як і я, щойно розпочали новий проект і використовуєте вбудовану в пам'ять базу даних SQLite ( sqlite:///:memory:). Якщо ви застосуєте міграцію до такої бази даних, очевидно, що наступного разу, коли ви захочете сказати автогенерувати ревізію, база даних все ще буде у вихідному стані (порожня), тому alembic скаржиться, що цільова база даних не відповідає дата. Рішення полягає в переході на постійну базу даних.


0

Щоб виправити цю помилку, видаліть останній файл міграції (файл python), а потім спробуйте виконати міграцію заново.



-6

Щоб вирішити цю проблему, я скидаю (видаляю) таблиці при міграції та запускаю ці команди

flask db migrate

і

flask db upgrade
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.