【问题标题】:Can't connect to MySQL server in Django 2.x.x Python AppEngine无法在 Django 2.x.x Python AppEngine 中连接到 MySQL 服务器
【发布时间】:2019-02-06 10:10:46
【问题描述】:

我正在尝试为我的 APPEngine 帐户使用云 SQL / mysql 实例。该应用程序是一个 python django-2.1.5 appengine 应用程序。我在谷歌云中创建了一个 MYSQL 实例。

我在从 SQL 实例详细信息复制的 app.yaml 文件中添加了以下内容:

beta_settings:
  cloud_sql_instances: <INSTANCE_CONNECTION_NAME>=tcp:<TCP_PORT>
  • 我已为我的 appengine 项目 xxx-app 的所有者 xxx-app@appspot.gserviceaccount.com 授予 Cloud SQL Client 权利。我已经为应用程序 XYZ 创建了一个数据库用户帐户,它可以连接到所有主机(* 选项)

  • 我在 settings.py 中的连接详情如下:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'my-db',
            'USER': 'appengine',
            'PASSWORD': 'xxx',
            'HOST': '111.111.11.11', # used actual ip
            'PORT': '3306'
        }
    }
DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '/cloudsql/<your-project-id>:<your-cloud-sql-instance>',
            'NAME': '<your-database-name>',
            'USER': 'root',
        }
    }
  • 我也无法从本地连接。但是,如果我对我的本地 IP 执行Add Network 然后尝试连接本地连接。使用 CIDR 表示法添加本地 IP 地址的网络后,该应用在本地运行良好。

我的问题:

  • 如果不添加 AppEngine 分配的 IP 地址,我将无法连接到 Cloud sql。它给了我一个错误:
OperationalError: (2003, "Can't connect to MySQL server on '0.0.0.0' ([Errno 111] Connection refused)")
  • 在哪里可以找到 appengine 分配的 IP 地址。即使是暂时的,我也不介意。我知道如果我需要静态 IP 地址,我必须创建一个计算 VM 实例。

【问题讨论】:

  • 您是否在防火墙处添加了例外?
  • 不,它们是默认值。如何获取appengine当前容器分配的IPAddress?

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


【解决方案1】:

App Engine 对特定实例的 IP 地址不提供任何保证,并且可能随时更改。由于它是一个无服务器平台,它抽象了基础设施,让您可以专注于您的应用程序。

使用 App Engine Flex 时有两个选项:Unix 域套接字和 TCP 端口。 App Engine 为您提供哪一种取决于您在 app.yaml 中指定的方式:

  • cloud_sql_instances: &lt;INSTANCE_CONNECTION_NAME&gt;/cloudsql/&lt;INSTANCE_CONNECTION_NAME&gt;
  • cloud_sql_instances: &lt;INSTANCE_CONNECTION_NAME&gt;=tcp:&lt;TCP_PORT&gt; 提供本地 tcp 端口 (127.0.0.1:&lt;TCP_PORT&gt;)。

您可以在Connecting from App Engine 页面上找到更多信息。

【讨论】:

  • 是的,我试过了。令人惊讶的是,Unix 套接字连接给了我一个错误,说不存在这样的文件。我再次查看并获得了实例 IP 地址,并将符号放入已批准的 MySQL 中,并且它有效。不确定我在 Unix 套接字路径上哪里出错了。您可以为 unix 套接字连接、app.yaml 和 MySQL 属性指向任何示例项目吗?
  • @gary 我上面链接的页面上的示例可以在这里完整地找到:github.com/GoogleCloudPlatform/python-docs-samples/tree/master/…
  • 好酷。我会再次尝试这种模式。可能是我错过了什么。感谢您的宝贵时间。
猜你喜欢
  • 2011-06-19
  • 2020-09-13
  • 1970-01-01
  • 2015-05-10
  • 2012-11-03
  • 2013-10-01
  • 2015-01-21
相关资源
最近更新 更多