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

Han*_*Gay 9 sqlalchemy heroku 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
Run Code Online (Sandbox Code Playgroud)

对我来说,这似乎表明它正在尝试加载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)
Run Code Online (Sandbox Code Playgroud)

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

Han*_*Gay 13

事实证明,Flask-Heroku正在拉动DATABASE_URL我在Heroku上的应用程序不存在的值.相反,如果我手动映射的值HEROKU_POSTGRESQL_CRIMSON_URLapp.config['SQLALCHEMY_DATABASE_URI'],它按预期工作.

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

更新2:让我总结一下:使用flask-heroku将正确的SQLALCHEMY_DATABASE_URI注入到应用程序的配置中,调整env.py以使用您的应用程序配置SQLALCHEMY_DATABASE_URI而不是URL alembic.ini,然后通过heroku run alembic upgrade head(或者您想要运行的任何迁移)在Heroku的服务器上运行alembic .这将阻止您不得不调整ini文件以针对不同的环境进行调整(因为托管环境将为您管理它).