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



我有一个5年前写的Django应用程序,它在谷歌应用引擎上成功运行,直到上个月谷歌升级到第二代云SQL。

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

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

谷歌的升级指南告诉我,连接名称需要从"my-project-name:my-db-instance"更改为"my-probject-name:my-region:my-db-instance"。这很简单。改变这个导致我得到错误

/login/处的内部错误

(0,u'未被授权访问实例:我的项目名称:我的地区:我的数据库实例'(

根据这个问题,我需要在实例名称中添加前缀"/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': '******************',
},

我将修改后的文件上传到谷歌(使用gcloud应用程序部署(。这次我得到了一个完全不同的错误屏幕,显示:

错误:服务器错误

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

请在30秒内重试。

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

配置不正确:加载MySQLdb模块时出错:没有命名的模块MySQLdb

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

谷歌提供了如何做到这一点的文档和示例。然而,我觉得谷歌的说明没有多大帮助。对于连接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应用程序,只需在我的settings.py文件中做一些更改,就可以使用第二代谷歌云SQL实例吗?如果是,会发生什么变化?

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

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

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

在引入SQLAlchemy指令之前,您一直走在正确的轨道上。这些不是Django配置。只要完成以下步骤,您应该能够保持当前的DATABASES语法:

  • 确保将设置添加到app.yaml中,以允许创建新数据库
  • 确保已将Cloud SQL Client(首选(权限设置为应用程序引擎服务帐户
  • 确保将mysqlclient作为Python依赖项

Django on App Engine Flex指南使用PostgreSQL,但确实包含了一些MySQL特定的建议,这些建议应该很有用。这里还有DATABASE配置示例。

希望这能有所帮助!

非常感谢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 = {
'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',
},

我发现我不需要为应用程序引擎服务帐户设置任何权限。谷歌的升级指南指出:

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

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

相关内容

  • 没有找到相关文章

最新更新