Не удается завершить флажок-миграцию

Я установил локальную базу данных 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, эта ошибка обычно означает именно то, что она говорит. Это может быть вызвано:

  • не подключиться к правильному экземпляру базы данных (проверьте свой адрес db: имя хоста/порта и db)
  • Неправильная настройка SQLAlchemy (см.: SQLAlchemy create_all() не создает таблицы)

Ответ 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