10

我正在尝试在 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)

appFlask 实例在哪里。我正在使用 Flask-SQLAlchemy 来干燥我在应用程序中的数据库使用情况,并使用 Flask-Heroku 来确保我的所有 Flask 配置变量都从 Heroku 环境变量中正确提取。

4

3 回答 3

14

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

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

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

于 2012-11-07T02:43:25.233 回答
2

可以在Procfile. 我的最终看起来像:

web: gunicorn ...
release: alembic upgrade head
于 2020-12-30T03:35:21.973 回答
1

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

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

于 2020-01-02T21:13:09.670 回答