【问题标题】:Can't connect to Cloud SQL using PyMySQL无法使用 PyMySQL 连接到 Cloud SQL
【发布时间】:2017-04-11 07:18:07
【问题描述】:

我正在尝试从在 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 套接字进行连接,而是尝试使用主机参数的默认值(我假设是 localhost)

我可以使用相同的连接字符串连接 MySQLdb。

【问题讨论】:

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


    【解决方案1】:

    我使用 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)
    

    【讨论】:

      【解决方案2】:

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

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

      详情请见Github thread

      【讨论】:

        【解决方案3】:

        那为什么不使用 MySQLdb 呢?

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

        【讨论】:

        • 呵呵,我就是这么做的 :) 据我所知,mysqldb 库不支持 Python 3。因此,这些天使用 PyMySQL 的选项更具前瞻性(因为它是 mysqldb API兼容,两者之间迁移很容易)
        猜你喜欢
        • 2018-03-18
        • 2020-01-27
        • 2014-01-28
        • 2022-01-24
        • 2019-04-17
        • 2021-01-28
        • 2021-08-10
        • 2021-02-12
        相关资源
        最近更新 更多