【问题标题】:Running flask-migrate on heroku produces error在 heroku 上运行 flask-migrate 会产生错误
【发布时间】:2014-02-27 01:01:50
【问题描述】:

我正在尝试使用 flask-migrate 在本地对我的数据库进行版本控制,然后反映生产中的更改(Heroku)。到目前为止,我成功地对本地数据库进行了版本控制并对其进行了升级,所以现在我想在 Heroku 上反映这一点。为此,我将最新的代码状态连同新创建的 migrations 文件夹和更新的 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 上无效?

【问题讨论】:

    标签: python heroku alembic flask-migrate


    【解决方案1】:

    我为此苦苦挣扎了一段时间,甚至在 Heroku python 论坛上发帖,但到目前为止还没有回复。为了解决这个问题,我决定不在 Heroku 上远程运行迁移,而是在我的开发机器上运行迁移并传递生产数据库地址。所以我这样做:

    1. 将开发数据库与生产数据库同步(使用 Heroku 时,您可以使用 heroku pg:pull 轻松完成此操作,但您必须在调用此方法之前删除本地数据库)
    2. 假设您的模型已经更新,请运行 python app.py db migrate重要提示:我也开始在本地收到原始错误,我发现我必须在我的 app.py 所在的完全相同的目录中,否则我会收到错误。
    3. 查看您自动生成的迁移脚本
    4. 使用 python app.py db upgrade 升级您的本地数据库
    5. 更改应用的设置以使用生产数据库而不是本地开发数据库,​​然后再次运行 python app.py db upgrade

    经过一番思考后,我突然想到,这可能就是该工具的工作方式。虽然能够从 Heroku 远程运行迁移仍然很好,但我会接受我的解决方案,因为它更快并且可以完成工作。

    【讨论】:

      【解决方案2】:

      我没有在 Heroku 上尝试过这个,但是遇到了同样的错误和症状。我的问题是在本地运行时,我当前的工作目录设置为项目根目录,而远程运行时,它设置为用户的主目录。

      先尝试 cd'ing 到正确的起始目录,或者将 --directory 参数传递给 flask-migrate 命令,并使用迁移文件夹的绝对路径。

      【讨论】:

        【解决方案3】:

        和你有同样的问题。然后我尝试提交migrations/alembic.ini,然后事情开始起作用了。在提交之前确保该文件中没有敏感信息。希望这也能解决您的问题。

        【讨论】:

          【解决方案4】:

          详细说明lawicko的回答,在使用Flask-Migrate和Heroku时,对生产数据库进行数据库迁移的一个好方法是下载生产数据库,在本地生成迁移脚本,然后在Heroku上运行迁移脚本。另一种方法是使用本地开发数据库生成迁移并在 Heroku 上为生产数据库运行迁移脚本,但如果本地和生产迁移不同步,执行数据库升级时会出现错误。

          以下是下载生产数据库并在本地生成迁移的详细步骤:

          1. 使用命令heroku pg:pull DATABASE_URL new_db_name -a heroku_app_name 创建一个新的本地 Postgres 数据库,其名称为 new_db_name,并且与 Heroku 上的 Postgres 数据库相同的数据库架构和内容。同名的数据库必须不存在。您可以使用 Postico 等工具通过 GUI 查看和管理本地 Postgres 数据库。

          2. 配置您的 Flask 应用程序以使用新的 Postgres 数据库。假设正在使用 Flask-SQLAlchemy,在 Flask 的配置集中SQLALCHEMY_DATABASE_URI = "postgresql://localhost/new_db_name"

          3. 现在 Flask 识别出新的本地 Postgres 数据库镜像生产数据库,使用 Flask-Migrate 的 flask db initflask db migrate 命令生成迁移脚本。

          4. 将 Flask-Migrate 生成的迁移文件夹推送到 Heroku。

          5. 使用 Flask-Migrate 通过heroku run flask db upgrade -a heroku_app_name 升级 Heroku 上的生产数据库。

          【讨论】:

            猜你喜欢
            • 2014-07-24
            • 1970-01-01
            • 2021-06-24
            • 2016-08-07
            • 1970-01-01
            • 1970-01-01
            • 2019-12-12
            • 1970-01-01
            • 2012-06-01
            相关资源
            最近更新 更多