我正在尝试使用flask-migrate在本地对我的数据库进行版本化,然后反映生产中的变化(Heroku)。到目前为止,我成功地对本地数据库进行了版本升级并进行升级,所以现在我想在Heroku上反映这一点。为此,我将最新的代码状态与新创建的迁移文件夹和更新的requirements.txt一起推送到Heroku。我看到依赖项已成功安装:
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上工作?
答案 0 :(得分:2)
我在这方面已经挣扎了一段时间,甚至发布在Heroku python论坛上,但到目前为止还没有回复。为了解决这个问题,我决定不在Heroku上远程运行迁移,而是在我的开发机器上运行迁移并传递生产数据库地址。所以我这样做:
经过一番思考后,我觉得这可能就是这个工具的设计方式。虽然能够从Heroku远程运行迁移仍然会很好,但我会满足于我的解决方案,因为它更快并完成工作。
答案 1 :(得分:1)
我没有用Heroku试过这个,但遇到了同样的错误和症状。我的问题是,在本地运行时,我当前的工作目录设置为项目根目录,当远程运行时,它被设置为用户的主目录。
首先尝试cd到正确的起始目录,或者将--directory参数传递给flask-migrate命令,其中包含迁移文件夹的绝对路径。
答案 2 :(得分:1)
详细说明lawicko的答案,使用Flask-Migrate和Heroku时,为生产数据库进行数据库迁移的一种好方法是下载生产数据库,在本地生成迁移脚本,然后运行迁移脚本在Heroku上。另一种方法是使用本地开发数据库生成迁移并在Heroku上为生产数据库运行迁移脚本,但如果本地迁移和生产迁移不同步,则在执行数据库升级时会出现错误。
以下是更详细地下载生产数据库并在本地生成迁移的步骤:
使用命令heroku pg:pull DATABASE_URL new_db_name -a heroku_app_name
创建一个名为new_db_name的新本地Postgres数据库,以及Heroku上Postgres数据库的相同数据库模式和内容。必须不存在具有相同名称的数据库。您可以使用Postico等工具通过GUI查看和管理本地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 run flask db upgrade -a heroku_app_name
升级Heroku上的生产数据库。
答案 3 :(得分:0)
和你一样有同样的问题。然后我尝试提交migrations/alembic.ini
,然后事情开始起作用了。在提交之前,请确保该文件中没有敏感信息。希望这也解决了你的问题。