我应该如何在Heroku上运行alembic迁移?

时间:2012-11-07 01:53:41

标签: heroku sqlalchemy flask flask-sqlalchemy alembic

我正在尝试在Heroku上运行一个相当简单的Flask + SQLAlchemy站点,但我不确定如何运行迁移来设置我的数据库。当我运行heroku run alembic upgrade head时,我收到以下错误:

Running `alembic upgrade head` attached to terminal... up, run.1
Traceback (most recent call last):
  File "/app/.heroku/venv/bin/alembic", line 12, in <module>
    load_entry_point('alembic==0.4.0', 'console_scripts', 'alembic')()
  File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/config.py", line 255, in main
    CommandLine(prog=prog).main(argv=argv)
  File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/config.py", line 250, in main
    self.run_cmd(cfg, options)
  File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/config.py", line 241, in run_cmd
    **dict((k, getattr(options, k)) for k in kwarg)
  File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/command.py", line 124, in upgrade
    script.run_env()
  File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/script.py", line 191, in run_env
    util.load_python_file(self.dir, 'env.py')
  File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/util.py", line 185, in load_python_file
    module = imp.load_source(module_id, path, open(path, 'rb'))
  File "alembic/env.py", line 80, in <module>
    run_migrations_online()
  File "alembic/env.py", line 63, in run_migrations_online
    poolclass=pool.NullPool)
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/engine/__init__.py", line 349, in engine_from_config
    return create_engine(url, **opts)
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/engine/__init__.py", line 330, in create_engine
    return strategy.create(*args, **kwargs)
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/engine/strategies.py", line 64, in create
    dbapi = dialect_cls.dbapi(**dbapi_args)
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py", line 289, in dbapi

对我来说,这似乎表明它正在尝试加载sqlite内容(这是我在alembic.ini中的默认设置),但我在env.py中有以下内容以努力使用它Heroku PostgreSQL连接:

cur_db_uri = config.get_section_option('alembic', 'sqlalchemy.url')
my_db_uri = app.config.get('SQLALCHEMY_DATABASE_URI', cur_db_uri)
config.set_section_option('alembic', 'sqlalchemy.url', my_db_uri)

其中app是Flask实例。我正在使用Flask-SQLAlchemy来干扰我在应用程序中的数据库使用,以及Flask-Heroku以确保从Heroku环境变量中正确地提取所有Flask配置变量。

3 个答案:

答案 0 :(得分:13)

事实证明,Flask-Heroku正在提取DATABASE_URL的值,这对我的Heroku上的应用程序来说并不存在。相反,我会手动将HEROKU_POSTGRESQL_CRIMSON_URL的值映射到app.config['SQLALCHEMY_DATABASE_URI'],它会按预期工作。

更新:事实证明我忘了pg:promote我的数据库以便为该应用设置默认值,这就是为什么DATABASE_URL不存在的原因。所以真正的解决方案是:不要忘记推广你的数据库。

更新2:让我总结一下:使用flask-heroku将适当的SQLALCHEMY_DATABASE_URI注入您应用的配置中,调整env.py以使用您应用已配置的SQLALCHEMY_DATABASE_URI代替alembic.ini中的URL,然后通过heroku run alembic upgrade head(或您想要运行的任何迁移)在Heroku的服务器上运行alembic。这将阻止您调整ini文件以适应不同的环境(因为托管环境将为您管理)。

答案 1 :(得分:1)

您可以在 Procfile 中指定 release phase task。我的最终看起来像:

web: gunicorn ...
release: alembic upgrade head

答案 2 :(得分:0)

我也认为我必须在heroku上手动运行alembic upgrade head才能进行数据库更改,但是事实并非如此。如果您的应用程序中具有正确的DATABASE_URL值,那么alembic迁移将在部署时运行,而无需再次运行。

要确认,您可以连接到数据库heroku pg:psql <database name> --app <application name>并进行检查。