【问题标题】:How do I upgrade an old Django Google App Engine application to a Second Generation Cloud SQL Instance?如何将旧的 Django Google App Engine 应用程序升级到第二代 Cloud SQL 实例?
【发布时间】:2020-07-19 22:54:14
【问题描述】:

我有一个 5 年前编写的 Django 应用程序,它一直在 Google App Engine 上成功运行 - 直到上个月 Google 升级到第二代 Cloud SQL。

目前,我有一个 settings.py 文件,其中包含一个如下所示的数据库定义:

DATABASES = {
    'default': {
        'ENGINE': 'google.appengine.ext.django.backends.rdbms',
        'INSTANCE': 'my-project-name:my-db-instance',
        'NAME': 'my-db-name',
    },

Google 的upgrade guide 告诉我连接名称需要从“my-project-name:my-db-instance”更改为“my-project-name:my-region:my-db-instance”。这很简单。改变它会导致我得到错误

/login/ 处的内部错误

(0, u'无权访问实例: 我的项目名称:我的区域:我的数据库实例')

根据this question,我需要在我的实例名称中添加前缀“/cloudsql/”。所以,我改变了这个(和 ENGINE 规范)给:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'INSTANCE': '/cloudsql/my-project-name:my-region:my-db-instance',
        'NAME': 'my-db-name',
        'USER' : 'root',
        'PASSWORD': '******************',
    },

我将修改后的文件上传到 Google(使用 gcloud app deploy)。这次我得到一个完全不同的错误屏幕,显示:

错误:服务器错误

服务器遇到错误,无法完成您的请求。

请在 30 秒后重试。

当我查看日志时,我看到:

配置不当:加载 MySQLdb 模块时出错:未命名模块 MySQL数据库

Daniel Ocandothis question 中指出,“rdbms 库不适用于升级的第二代云 SQL 实例”。现在需要通过 Unix 域套接字建立与数据库的连接。

Google 提供了有关如何执行此操作的文档和示例。但是,我不觉得谷歌的instructions 很有帮助。为了连接 Python 应用程序,他们给出了这个示例代码:

main.py:
db = sqlalchemy.create_engine(
    sqlalchemy.engine.url.URL(
        drivername="mysql+pymysql",
        username=db_user,
        password=db_pass,
        database=db_name,
        query={"unix_socket": "/cloudsql/{}".format(cloud_sql_connection_name)},
    ),
)

我的应用程序没有 main.py 文件,所以我真的不知道该把这段代码放在哪里。我已经在 GitHub 中查看了完整的示例代码,但对于我需要在我的 settings.py 文件或我的应用程序的其他地方进行哪些更改,我一无所知。

我的问题是:我真的必须走这条路(转向使用 SQLalchemy 库),还是我可以通过对我的设置进行一些更改来升级我的 Django 应用程序以使用第二代谷歌云 SQL 实例。 .py 文件?如果有,有什么变化?

我的应用程序使用 Django 1.4、Python 2.7,我没有使用 Google 建议的 Flask 框架。

我在 5 年前学会使用 Django 纯粹是为了编写这个应用程序,但从那以后我就再也没有使用过它 - 所以我几乎忘记了我所知道的关于 Django 和 Python 的一切。

【问题讨论】:

    标签: python django google-app-engine google-cloud-platform google-cloud-sql


    【解决方案1】:

    在我开始之前这里有几点说明:不再支持 Django 1.4 和 Python 2.7,所以这个配置可能会也可能不会起作用。

    在介绍 SQLAlchemy 指令的部分之前,您一直走在正确的轨道上。这些不是 Django 配置。如果您完成以下步骤,您应该能够保留当前的 ​​DATABASES 语法:

    • 确保将设置添加到app.yamlallow your new database
    • 确保您已将 Cloud SQL Client(首选)权限设置为 App Engine 服务帐户。
    • 确保您有 mysqlclient 作为 Python 依赖项。

    Django on App Engine Flex guide 使用 PostgreSQL,但确实包含一些应该有用的MySQL specific suggestions。那里还有DATABASE 配置示例。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      非常感谢glasnt 的有用建议。这些使我走上了正确的轨道,再加上我在其他地方找到的一些信息,我的网站重新启动并再次运行——这让我的客户非常高兴!

      以下是我必须更改的详细信息:

      我更新了我的 app.yaml 文件并添加了:

      beta_settings: 
        cloud_sql_instance: "my-project-name:my-region:my-db-instance"
      

      还有:

      libraries:
      - name: MySQLdb
        version: "latest"
      

      我更新了settings.py,并添加了:

      import MySQLdb
      

      我将 DATABASES 定义更新为:

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'HOST': '/cloudsql/my-project-name:my-region:my-db-instance',
              'NAME': 'my-db-name',
              'USER' : 'root',
              'PASSWORD': 'my-db-password',
          },
      

      我发现我不需要为 App Engine 服务帐户设置任何权限。谷歌的upgrade guide,声明:

      当您使用授权的 App Engine 项目升级实例时 从第一代到第二代,Cloud SQL 创建了一个 提供与 授权的 App Engine 项目在升级之前做了。因为这 服务帐户仅授权访问特定实例,而不是 与整个项目相比,此服务帐户在 IAM 服务帐号页面,您无法更新或删除它。

      因此,对于迁移的第一代应用程序,无需配置权限。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-31
        • 1970-01-01
        • 2019-01-17
        • 2016-04-28
        • 2019-06-22
        • 2020-09-01
        • 2010-11-10
        相关资源
        最近更新 更多