Запуск колбы-переноса на героку выдает ошибку

Я пытаюсь использовать flask-migrate для локальной версии моей базы данных, а затем отразить изменения в работе (Heroku). До сих пор мне удавалось успешно создавать версии локальной базы данных и обновлять ее, поэтому теперь я хотел отразить это на Heroku. Чтобы сделать это, я отправил последнее состояние кода в Heroku вместе с недавно созданной папкой миграций и обновленным файл require.txt. Я увидел, что зависимости были успешно установлены:

Successfully installed Flask-Migrate alembic Flask-Script Mako

Затем я попробовал:

$ heroku run python app/hello.py db upgrade

К сожалению, я получил это в ответ:

Running `python app/hello.py db upgrade` attached to terminal... up, run.4322
Traceback (most recent call last):
  File "app/hello.py", line 37, in <module>
    manager.run()
  File "/app/.heroku/python/lib/python2.7/site-packages/flask_script/__init__.py", line 405, in run
    result = self.handle(sys.argv[0], sys.argv[1:])
  File "/app/.heroku/python/lib/python2.7/site-packages/flask_script/__init__.py", line 384, in handle
    return handle(app, *positional_args, **kwargs)
  File "/app/.heroku/python/lib/python2.7/site-packages/flask_script/commands.py", line 145, in handle
    return self.run(*args, **kwargs)
  File "/app/.heroku/python/lib/python2.7/site-packages/flask_migrate/__init__.py", line 97, in upgrade
    config = _get_config(directory)
  File "/app/.heroku/python/lib/python2.7/site-packages/flask_migrate/__init__.py", line 37, in _get_config
    config.set_main_option('script_location', directory)
  File "/app/.heroku/python/lib/python2.7/site-packages/alembic/config.py", line 142, in set_main_option
    self.file_config.set(self.config_ini_section, name, value)
  File "/app/.heroku/python/lib/python2.7/ConfigParser.py", line 753, in set
    ConfigParser.set(self, section, option, value)
  File "/app/.heroku/python/lib/python2.7/ConfigParser.py", line 396, in set
    raise NoSectionError(section)
ConfigParser.NoSectionError: No section: 'alembic'

Я гуглил, чтобы найти, что это может быть, и похоже, что файл конфигурации не может быть открыт, однако я понятия не имею, что можно сделать, чтобы это исправить. Почему это работает локально, но не на Heroku?

4 ответа

Решение

Я боролся с этим в течение некоторого времени и даже разместил на форумах по питону Heroku, но пока никаких ответов. Чтобы решить эту проблему, я решил не запускать миграцию удаленно на Heroku, а запустить миграцию на моей машине для разработки и вместо этого передать адрес рабочей базы данных. Итак, я делаю это:

  1. Синхронизируйте db разработки с производством (при использовании Heroku вы можете легко сделать это с помощью heroku pg: pull, однако перед вызовом этого метода вы должны сбросить свой локальный db)
  2. Предполагая, что ваши модели уже обновлены, запустите python app.py db migrate. Важно: я тоже начал получать исходную ошибку на своем локальном компьютере, я понял, что должен находиться в том же каталоге, где находится мой app.py, в противном случае я получаю ошибку.
  3. Просмотрите автоматически созданные сценарии миграции
  4. Обновите свою локальную базу данных с помощью python app.py
  5. Измените настройки вашего приложения, чтобы использовать производственную базу данных вместо локальной базы разработки, а затем снова запустите python app.py db upgrade

После некоторых размышлений меня поразило, что, возможно, именно так и был разработан этот инструмент для работы. Хотя было бы неплохо иметь возможность удаленного запуска миграций с Heroku, я согласен с моим решением, так как оно быстрее и выполняет свою работу.

Я не пробовал это с Heroku, но столкнулся с той же ошибкой и симптомами. Проблема для меня заключалась в том, что при локальном запуске мой текущий рабочий каталог был установлен в корневой каталог проекта, а при удаленном запуске - в домашний каталог пользователя.

Попробуйте сначала перейти в правильный начальный каталог или передать параметр --directory команде flask-migrate, указав абсолютный путь к папке с миграциями.

Чтобы уточнить ответ lawicko, при использовании Flask-Migrate и Heroku хорошим способом выполнения миграции базы данных для производственной базы данных является загрузка производственной базы данных, локальный генерирование сценария миграции и запуск сценария миграции в Heroku. Альтернативой является использование локальной базы данных разработки для генерации миграций и запуска сценария миграции на Heroku для производственной базы данных, но если локальная и производственная миграции не синхронизируются, при обновлении базы данных могут возникать ошибки.

Вот шаги для загрузки производственной базы данных и создания миграций локально более подробно:

  1. Используйте команду heroku pg:pull DATABASE_URL new_db_name -a heroku_app_name которая создает новую локальную базу данных Postgres с именем new_db_name и той же схемой базы данных и содержимым вашей базы данных Postgres в Heroku. База данных с таким именем еще не должна существовать. Вы можете использовать такой инструмент, как Postico, для просмотра и управления локальными базами данных Postgres с помощью графического интерфейса.

  2. Настройте приложение Flask для использования новой базы данных Postgres. Предполагая, что Flask-SQLAlchemy используется в наборе конфигурации Flask SQLALCHEMY_DATABASE_URI = "postgresql://localhost/new_db_name",

  3. Теперь, когда Flask распознает новую локальную базу данных Postgres, отражающую производственную базу данных, используйте Flask-Migrate flask db init а также flask db migrate Команды для генерации скрипта миграции.

  4. Переместите папку миграции, созданную Flask-Migrate, в Heroku.

  5. Используйте Flask-Migrate, чтобы обновить производственную базу данных на Heroku с помощью heroku run flask db upgrade -a heroku_app_name,

Была такая же проблема, как у вас. Затем я попытался совершить migrations/alembic.ini и тогда все начало работать. Просто убедитесь, что в этом файле нет конфиденциальной информации перед его фиксацией. Надеюсь, это решит и вашу проблему.

Другие вопросы по тегам