在 Google App Engine 上运行 Alembic 迁移

Posted

技术标签:

【中文标题】在 Google App Engine 上运行 Alembic 迁移【英文标题】:Run Alembic migrations on Google App Engine 【发布时间】:2016-05-25 06:52:00 【问题描述】:

我有一个使用 SQLAlchemy (Flask-SQLAlchemy) 和 Alembic (Flask-Migrate) 的 Flask 应用程序。该应用程序在 Google App Engine 上运行。我想使用 Google Cloud SQL。

在我的机器上,我运行python manage.py db upgrade 来针对我的本地数据库运行我的迁移。由于 GAE 不允许运行任意 shell 命令,我如何在其上运行迁移?

【问题讨论】:

【参考方案1】: 将本地机器的 IP 列入白名单:https://console.cloud.google.com/sql/instances/INSTANCENAME/access-control/authorization?project=PROJECTNAME 创建用户:https://console.cloud.google.com/sql/instances/INSTANCENAME/access-control/users?project=PROJECTNAME 为实例分配外部 IP 地址:https://console.cloud.google.com/sql/instances/INSTANCENAME/access-control/ip?project=PROJECTNAME 使用以下 SQLAlchemy 连接 URI:SQLALCHEMY_DATABASE_URI = 'mysql://user:pw@ip:3306/DBNAME' 请记住稍后释放 IP,因为您按未使用的每小时收费

【讨论】:

最后一个项目中的“释放IP”是指第一个项目中的本机IP还是第三个项目中分配的外部IP?【参考方案2】:

这只是您可以运行的代码,因此您可以创建一个管理端点来实现升级:

@app.route('/admin/dbupgrade')
def dbupgrade():
    from flask_migrate import upgrade, Migrate
    migrate = Migrate(app, db)
    upgrade(directory=migrate.directory)
    return 'migrated'

(例如,Dropwizard 通过tasks 很好地满足了此类管理事务)

【讨论】:

【参考方案3】:

您可以将 Google Cloud SQL 实例的本地计算机的 IP 列入白名单,然后在本地计算机上运行脚本。

【讨论】:

这实际上是我最终做的。但是,为 SQL 实例分配 IPV4 地址的成本为 0.01 美元/小时 = 7.2 美元/月。如果有办法自动获取地址,运行迁移,然后发布它,我会是一个快乐的露营者 您可以使用 gcloud sql instances patch --assign-ip、gcloud sql instances patch --no-assign-ip 分配/取消分配 IP 地址

以上是关于在 Google App Engine 上运行 Alembic 迁移的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Cloud App Engine 上运行 PHP 服务

在 Google App Engine 上运行 Python37 的问题

在 Google App Engine 上按计划运行 python 脚本

首次使用Google App Engine使用Python创建留言板

在 Google-App-Engine 中使用 HSQLDB

在 Google App Engine 上部署 create-react-app