Запуск колбы-переноса на героку выдает ошибку
Я пытаюсь использовать 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, а запустить миграцию на моей машине для разработки и вместо этого передать адрес рабочей базы данных. Итак, я делаю это:
- Синхронизируйте db разработки с производством (при использовании Heroku вы можете легко сделать это с помощью heroku pg: pull, однако перед вызовом этого метода вы должны сбросить свой локальный db)
- Предполагая, что ваши модели уже обновлены, запустите python app.py db migrate. Важно: я тоже начал получать исходную ошибку на своем локальном компьютере, я понял, что должен находиться в том же каталоге, где находится мой app.py, в противном случае я получаю ошибку.
- Просмотрите автоматически созданные сценарии миграции
- Обновите свою локальную базу данных с помощью python app.py
- Измените настройки вашего приложения, чтобы использовать производственную базу данных вместо локальной базы разработки, а затем снова запустите python app.py db upgrade
После некоторых размышлений меня поразило, что, возможно, именно так и был разработан этот инструмент для работы. Хотя было бы неплохо иметь возможность удаленного запуска миграций с Heroku, я согласен с моим решением, так как оно быстрее и выполняет свою работу.
Я не пробовал это с Heroku, но столкнулся с той же ошибкой и симптомами. Проблема для меня заключалась в том, что при локальном запуске мой текущий рабочий каталог был установлен в корневой каталог проекта, а при удаленном запуске - в домашний каталог пользователя.
Попробуйте сначала перейти в правильный начальный каталог или передать параметр --directory команде flask-migrate, указав абсолютный путь к папке с миграциями.
Чтобы уточнить ответ lawicko, при использовании Flask-Migrate и Heroku хорошим способом выполнения миграции базы данных для производственной базы данных является загрузка производственной базы данных, локальный генерирование сценария миграции и запуск сценария миграции в Heroku. Альтернативой является использование локальной базы данных разработки для генерации миграций и запуска сценария миграции на Heroku для производственной базы данных, но если локальная и производственная миграции не синхронизируются, при обновлении базы данных могут возникать ошибки.
Вот шаги для загрузки производственной базы данных и создания миграций локально более подробно:
Используйте команду
heroku pg:pull DATABASE_URL new_db_name -a heroku_app_name
которая создает новую локальную базу данных Postgres с именем new_db_name и той же схемой базы данных и содержимым вашей базы данных Postgres в Heroku. База данных с таким именем еще не должна существовать. Вы можете использовать такой инструмент, как Postico, для просмотра и управления локальными базами данных Postgres с помощью графического интерфейса.Настройте приложение Flask для использования новой базы данных Postgres. Предполагая, что Flask-SQLAlchemy используется в наборе конфигурации Flask
SQLALCHEMY_DATABASE_URI = "postgresql://localhost/new_db_name"
,Теперь, когда Flask распознает новую локальную базу данных Postgres, отражающую производственную базу данных, используйте Flask-Migrate
flask db init
а такжеflask db migrate
Команды для генерации скрипта миграции.Переместите папку миграции, созданную Flask-Migrate, в Heroku.
Используйте Flask-Migrate, чтобы обновить производственную базу данных на Heroku с помощью
heroku run flask db upgrade -a heroku_app_name
,
Была такая же проблема, как у вас. Затем я попытался совершить migrations/alembic.ini
и тогда все начало работать. Просто убедитесь, что в этом файле нет конфиденциальной информации перед его фиксацией. Надеюсь, это решит и вашу проблему.