【发布时间】: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 Ocando 在this 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