Не удается подключиться к Cloud SQL с помощью PyMySQL

Я пытаюсь подключиться к Cloud SQL из приложения Python (с использованием PyMySQL 0.7.9), работающего поверх Google App Engine.

Моя строка подключения выглядит так (учетные данные, конечно, поддельные):

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 с той же строкой подключения.


person Niklas9    schedule 27.11.2016    source источник


Ответы (3)


По-видимому, PyMySQL в настоящее время не поддерживается в стандартной среде Google App Engine, в которой работает только Python 2.7 (по состоянию на июнь 2018 г.). Это от сопровождающих проекта GCP python:

Я могу подтвердить, что pymysql не поддерживается во время выполнения python27. Однако в большинстве случаев можно использовать pymysql локально и mysqldb в рабочей среде, используя try:/except ImportError: для условного импорта одного или другого. Поскольку они используют один и тот же интерфейс, вы можете использовать import as, чтобы две разные библиотеки использовали одно и то же имя для простоты использования в вашем коде.

Подробнее см. в этой ветке Github.

person kip2    schedule 11.06.2018

Почему бы тогда не использовать MySQLdb?

У меня была такая же проблема с развертыванием приложения Flask с PyMySQL, я безуспешно пробовал много исправлений. Мой обходной путь заключался в том, чтобы вместо этого использовать MySQLDb, ага..!

person Alexandre Tea    schedule 11.12.2016
comment
Хе-хе, это то, что я делаю :) Насколько мне известно, библиотека mysqldb не поддерживает Python 3. Следовательно, в наши дни более перспективным вариантом является использование PyMySQL (а поскольку он совместим с API mysqldb, миграция между ними проста). ) - person Niklas9; 12.12.2016

Я получил его для подключения с помощью 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)
person Malachi Bazar    schedule 19.11.2018