繁体   English   中英

如何将旧的 Django Google App Engine 应用程序升级到第二代云 SQL 实例?

[英]How do I upgrade an old Django Google App Engine application to a Second Generation Cloud SQL Instance?

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

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

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

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

/login/ 处的内部错误

(0, u'无权访问实例:my-project-name:my-region:my-db-instance')

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

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 模块时出错:没有名为 MySQLdb 的模块

Daniel Ocando这个问题中指出,“rdbms 库将无法与升级的第二代云 SQL 实例一起使用”。 现在需要通过 Unix 域套接字连接到数据库。

Google 提供了有关如何执行此操作的文档和示例。 但是,我不觉得谷歌的说明很有帮助。 为了连接 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 文件或我的应用程序的其他地方进行哪些更改,我并不知道。

My question is: Do I really have to go down this route (shifting to use SQLalchemy library), or can I upgrade my Django app to work with a second generation Google cloud SQL instance simply by making some changes in my settings.py file? 如果是这样,有什么变化?

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

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

在我开始之前这里有几点注意事项:Django 1.4 和 Python 2.7 不再受支持,因此此配置可能有效,也可能无效。

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

  • 确保将设置添加到您的app.yaml允许您的新数据库
  • 确保您已将Cloud SQL Client (首选)权限设置为 App Engine 服务帐号。
  • 确保您有mysqlclient作为 Python 依赖项。

App Engine Flex 指南上的 Django使用 PostgreSQL,但确实包含了一些应该有用的MySQL 特定建议 那里还有示例数据库配置。

希望这可以帮助!

非常感谢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 Service 帐户设置任何权限。 谷歌的升级指南,指出:

当您将具有授权 App Engine 项目的实例从第一代升级到第二代时,Cloud SQL 会创建一个特殊服务帐号,该帐号提供与升级前授权 App Engine 项目相同的访问权限。 由于此服务帐户仅授权访问特定实例,而不是整个项目,因此此服务帐户在 IAM 服务帐户页面中不可见,您无法更新或删除它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM