我有一个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服务帐户页面,您无法更新或删除它。
因此,对于迁移的第一代应用程序,无需配置权限。