我正在尝试在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配置变量。
答案 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>
并进行检查。