Не удается завершить флажок-миграцию
Я установил локальную базу данных Postgres с SQLAlchemy и не могу выполнить мою первую запись. Я продолжаю получать эту ошибку...
ProgrammingError: (ProgrammingError) relation "user" does not exist
LINE 1: INSERT INTO "user" (name, email, facebook_id, facebook_token...
Похоже, что поля не совпадают с полями в базе данных. Я пытаюсь мигрировать с помощью flask-migrate, но, когда я запускаю $ python app.py db migrate
, я получаю эту ошибку...
raise util.CommandError("No such revision '%s'" % id_)
alembic.util.CommandError: No such revision '39408d6b248d'
Лучше всего удалить все и начать с нуля, поскольку кажется, что я испортил настройку и/или миграцию базы данных, но я не уверен, как это сделать.
UPDATE. Теперь база данных начала работать (я упал и создал ее снова). Тем не менее, я все еще получаю ту же ошибку, что и при попытке запуска миграции, и получается, что "нет такой версии" 39408d6b248d "относится к миграции из несвязанного проекта. Я снова установил флажок-мигрировать, но такую же ошибку.
Ответы
Ответ 1
flask-migrate создаст таблицу с именем "alembic_version" в вашей базе данных.
поэтому вы должны удалить эту таблицу и удалить папку миграции в своем проекте.
а затем снова используйте $ python app.py db init
...
Я думаю, что $ python app.py db migrate
будет работать нормально.
Ответ 2
Alembic сохраняет историю миграции в вашей базе данных, поэтому она по-прежнему признает, что там есть другая ревизия. Я держу свой проект на Heroku, поэтому я смог просто сделать heroku pg: pull..., чтобы получить новую копию моей базы данных. До этого вам придется отказаться от локального db. Если вы не хотите отказываться от своего локального, я думаю, что падение таблицы должно работать. Я использую PG Commander в качестве инструмента GUI для быстрого просмотра моих баз данных.
Ответ 3
первый шаг - запустить эту команду
alembic current
вы должны получить ошибку, как указано выше (цель состоит в том, чтобы убедиться, что эта команда возвращает действительный ответ).
причина, почему вы получаете это, - bc alembic путается о вашем текущем состоянии. Предполагая, что вы должны быть в редакции 39408d6b248d
, но затем решает, что эта ревизия недействительна.
чтобы исследовать это, давайте выясним, какие ревизии считаются действительными с помощью alembic, выполните следующую команду:
alembic history --verbose
вы получите список всех предыдущих версий (обратите внимание: неплохо прикрепить сообщение рядом с каждой ревизией.. подумайте об этом как о хорошем сообщении git)
Rev: 594cc72f56fd (head)
Parent: 262f40e28682
Path: ***************
adjust context_id in log table so that it is a substring of the object_id
Revision ID: 594cc72f56fd
Revises: 262f40e28682
Create Date: 2015-07-22 14:31:52.424862
Rev: 262f40e28682
Parent: 1dc902bd1c2
Path: ***************
add context_id column to log table
Revision ID: 262f40e28682
Revises: 1dc902bd1c2
Create Date: 2015-07-22 11:05:37.654553
Rev: 1dc902bd1c2
Parent: <base>
Path: ***************
Initial database setup
Revision ID: 1dc902bd1c2
Revises:
Create Date: 2015-07-06 09:55:11.439330
версия 39408d6b248d
явно не существует в вышеупомянутых версиях. Эта ревизия хранится в базе данных alembic_table в базе данных.. вы можете проверить, перейдя в вашу базу данных и работая:
$ select * from alembic_version;
version_num
--------------
57ac999dcaa7
Итак, теперь вы должны просмотреть состояние своей базы данных и посмотреть, где она подходит по сравнению с приведенными выше версиями:
в моем случае, выкарабкаясь вокруг моей базы данных, становится очевидным, какая ревизия я сейчас... что это была база данных dbase, но другие версии еще не включены.
так что теперь я заменяю значение в dbase тем, которое я нашел из предыдущей команды history:
vibereel=> update alembic_version set version_num = '1dc902bd1c2';
и теперь работает текущий поток alembic
INFO [alembic.migration] Context impl PostgresqlImpl.
INFO [alembic.migration] Will assume transactional DDL.
1dc902bd1c2
сделано.
Ответ 4
Предполагая, что вы проверили, что база данных существует с использованием psql или pgAdmin, эта ошибка обычно означает именно то, что она говорит. Это может быть вызвано:
Ответ 5
Это означает, что запись в таблице alembic_version
вашего db - "39408d6b248d", и в папке миграции нет файла миграции (по умолчанию migrations/versions
).
Итак, лучше отбросьте таблицу alembic_version
из своего db и сделайте
$ python app.py db history
, чтобы получить новый заголовок миграции, скажем, 5301c31377f2
Теперь запустите $ python app.py db stamp 5301c31377f2
, чтобы alembic знал, что это ваша головка миграции (которая хранится в таблице alembic_version
).
Ответ 6
У меня такая же ошибка вчера, потому что в моем случае номер версии "39408d6b248d" связан с вашими предыдущими действиями обновления миграции, каждый раз, когда вы запускали обновление script, тогда будет генерироваться и храниться в файле data.sqlite версия Alembic.
вы должны выполнить любое обновление, которое было создано выше "39408d6b248d" , но затем вы удалили весь каталог migages/и удалили все сценарии обновления. База данных, например. data.sqlite по-прежнему сохраняет "39408d6b248d" , но не существует миграции script.
для моего решения я удаляю целые версии Alembic в базе данных и делал все обновления с нуля.
Ответ 7
У меня возникла аналогичная проблема. После выполнения команды python manage.py db migrate таблицы базы данных не были созданы, в базе данных была только таблица alembic.
Я нашел решение в документации для переноса флажков:
https://flask-migrate.readthedocs.org/en/latest/
Миграция script должна быть пересмотрена и отредактирована, так как Alembic в настоящее время не обнаруживает все изменения, внесенные вами в ваши модели. В В частности, Alembic в настоящее время не может обнаружить индексы. однажды финализация, миграция script также должна быть добавлена в версию контроль.
Затем вы можете применить миграцию к базе данных:
python manage.py db upgrade
Эта команда создала таблицы и применила миграцию базы данных.
Ответ 8
У меня была такая же проблема. Согласно версии в таблице alembic_version в db, действие миграции ищет эту версию в папке /migrations/versions, которая уже удалена. Поэтому решение заключается в удалении таблицы alembic_version:
Если вы используете sqlite,
1. Откройте файл xxx.sqlite db.
sqlite3 xxx.sqlite
2. проверить таблицы
.tables
3. вы увидите alembic_version, удалите его
DROP TABLE alembic_version