我尝试从运行在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。
答案 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)