【发布时间】:2020-07-01 03:21:10
【问题描述】:
更新:
我重新分叉了 GoogleCloudPlatform 示例项目并再次尝试。突然,它开始工作了。
我的问题有一半与我的目标项目使用 Flask-SQLAlchemy 这一事实有关。为此,我需要使用MySQLdb 方言,如以下答案所示:
https://stackoverflow.com/a/10900826/4455571
我仍然不确定为什么我第一次无法让 GoogleCloudPlatform 示例工作,以及为什么在我重新分叉后它突然开始工作。
原帖:
我正在尝试使用以下指南将在 Cloud Run 上运行的容器连接到 Cloud SQL: https://cloud.google.com/sql/docs/mysql/connect-run?hl=en_US
我已确保执行以下操作:
- 为我的项目启用 API
- 将“Cloud SQL Client”角色添加到我的 服务帐户 REDACTED-compute@developer.gserviceaccount.com
但是,连接失败并出现以下错误:
文件“/usr/local/lib/python3.8/site-packages/pymysql/connections.py”, 第 630 行,在连接中引发 exc sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "无法连接到 MySQL 服务器 在 'localhost' ([Errno 2] 没有这样的文件或目录)")
我使用来自 GitHub 的示例代码进行了第二次尝试: https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/cloud-sql/mysql/sqlalchemy
这些是我遵循的步骤:
- 镜像存储库并将其设为私有
- 编辑
app.yaml以添加类似于以下内容的凭据(我没有将值括在引号中 - 应该吗?):
env_variables:
CLOUD_SQL_CONNECTION_NAME: my-project-270323:us-central1:database
DB_USER: root
DB_PASS: areallygreatpassword
DB_NAME: database
- 将存储库连接到 Cloud Build 并触发了新的构建
- 在 Cloud Run 上的新服务中部署了我的容器,确保在 Connections > Cloud SQL 连接下按数据库选择
我得到同样的错误。我做错了什么?
编辑
这是完整的错误转储:
Traceback (most recent call last):()
File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app response = self.full_dispatch_request()()
File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1944, in full_dispatch_request self.try_trigger_before_first_request_functions()()
File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1992, in try_trigger_before_first_request_functions func()()
File "/app/main.py", line 81, in create_tables with db.connect() as conn:()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2209, in connect return self._connection_cls(self, **kwargs)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 103, in __init__ else engine.raw_connection()()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2306, in raw_connection return self._wrap_pool_connect(()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2279, in _wrap_pool_connect Connection._handle_dbapi_exception_noconnection(()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1547, in _handle_dbapi_exception_noconnection util.raise_from_cause(sqlalchemy_exception, exc_info)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 398, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 152, in reraise raise value.with_traceback(tb)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2276, in _wrap_pool_connect return fn()()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 303, in unique_connection return _ConnectionFairy._checkout(self)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 773, in _checkout fairy = _ConnectionRecord.checkout(pool)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 492, in checkout rec = pool._do_get()()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/impl.py", line 139, in _do_get self._dec_overflow()()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__ compat.reraise(exc_type, exc_value, exc_tb)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 153, in reraise raise value()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/impl.py", line 136, in _do_get return self._create_connection()()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 308, in _create_connection return _ConnectionRecord(self)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 437, in __init__ self.__connect(first_connect_check=True)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 652, in __connect connection = pool._invoke_creator(self)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect return dialect.connect(*cargs, **cparams)()
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 489, in connect return self.dbapi.connect(*cargs, **cparams)()
File "/usr/local/lib/python3.8/site-packages/pymysql/__init__.py", line 94, in Connect return Connection(*args, **kwargs)()
File "/usr/local/lib/python3.8/site-packages/pymysql/connections.py", line 325, in __init__ self.connect()()
File "/usr/local/lib/python3.8/site-packages/pymysql/connections.py", line 630, in connect raise exc sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 2] No such()
File or directory)")
另外,我是通过 Web 控制台而不是 CLI 执行此操作的。以下是我传递给 Google 提供的示例项目的设置:
drive.google.com/open?id=17nl_rQVTU2ZirCEu64bjfe90zGweg3a6 drive.google.com/open?id=1_Riy1HNSPvZZUGl4tJ0Z8puYuuMbUMPH
【问题讨论】:
标签: python docker google-cloud-platform google-cloud-sql google-cloud-run