无法使用PyMySQL连接到Cloud SQL

时间:2016-11-27 13:33:05

标签: python google-cloud-sql google-app-engine-python pymysql

我尝试从运行在Google App Engine之上的Python应用程序(使用PyMySQL 0.7.9)连接到Cloud SQL。

我的连接字符串看起来像这样(凭证当然是假的):

pymysql.connect(unix_socket='/cloudsql/gae_project_name:cloudsql_instance_name', 
                user='user', password='', db='database_name')

我收到的错误消息是:

OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 97] Address family not supported by protocol)")

就像PyMySQL没有意识到我试图通过Unix套接字连接并尝试使用host参数的默认值(我认为是localhost

我能够使用相同的连接字符串连接MySQLdb。

3 个答案:

答案 0 :(得分:3)

为什么不使用MySQLdb呢?

我在使用PyMySQL部署Flask应用程序时遇到了同样的问题,我尝试了很多修复但没有成功。我的解决方法是使用MySQLDb而不是aha ..!

答案 1 :(得分:1)

显然,Google App Engine Standard环境目前不支持PyMySQL,该环境仅运行Python 2.7(截至2018年6月)。这是来自GCP python项目的维护者:

  

我可以确认python27运行时不支持pymysql。但是,对于大多数用例,可以在生产中使用pymysql和mysqldb,使用try:/除了ImportError:有条件地导入一个或另一个。由于它们共享相同的接口,因此您可以使用import来使两个不同的库共享相同的名称,以便在代码中使用。

有关详细信息,请参阅此Github thread

答案 2 :(得分:0)

我使用Python3 Flex App Engine和PyMySQL进行连接。

这是我的app.yaml的样子:

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT api:app --timeout 180

runtime_config:
  python_version: 3

env_variables:
  SQLALCHEMY_DATABASE_URI: >-
    mysql+pymysql://user:password@/database?unix_socket=/cloudsql/project-name:us-central1:instance-name

beta_settings:
  cloud_sql_instances: us-central1:instance-name

# This sample incurs costs to run on the App Engine flexible environment. 
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/python/configuring-your-app-with-app-yaml
manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

确保在env_variables和beta_settings中都替换用户,密码,数据库和实例连接。

这是我的蟒蛇:

import pymysql.cursors
import pymysql
connection = pymysql.connect(unix_socket='/cloudsql/project-name:us-central1:instance-name',
        user='user',
        password='password',
        db='database',
        charset='utf8mb4',
        cursorclass=pymysql.cursors.DictCursor)