使用Python 3,Flask,SQLAlchemy,psycopg2-binary软件包和CloudSQL Postgres在Google App Engine(Flexible)上运行小型Web应用程序。该应用程序可以在我的本地开发环境中正确连接到CloudSQL(我使用代理),但是当部署在云中时似乎无法连接。
上周我第一次部署它时效果很好。推送更新并重新部署后,即使回滚到先前的提交,该应用也不再连接到Cloud Shell中或部署时的CloudSQL。但是它可以使用代理在我的本地开发机上正常连接。
我已经通过调试验证了必要的凭据已正确插入到我的SQLALCHEMY_DATABASE_URI中,即:postgres+psycopg2://[user]:[pw]@/[db_name]?host=/cloudsql/breadsheet:us-west1:breadsheet
。
自从最初的部署从Cloud Datastore升级到Firestore后,我在平台上所做的仅是更改,这是我从中提取环境变量以构建URI的地方。数据存储区从来没有数据,所以没关系。
我正在使用GAE Postgres connection guide(对于Unix)。这是我的app.yaml:
runtime: python
env: flex
instance_class: F1
entrypoint: gunicorn -w 1 breadsheet:breadapp
error_handlers:
- file: app/templates/errors/default_error.html
- error_code: over_quota
file: app/templates/errors/over_quota.html
beta_settings:
cloud_sql_instances: breadsheet:us-west1:breadsheet
这是当我从云壳中运行gunicorn时出现的错误:
(venv) [me]@cloudshell:~/breadsheet (breadsheet)$ gunicorn -w 1 breadsheet:breadapp
[2019-04-07 10:23:16 -0700] [471] [INFO] Starting gunicorn 19.9.0
[2019-04-07 10:23:16 -0700] [471] [INFO] Listening at: http://127.0.0.1:8000 (471)
[2019-04-07 10:23:16 -0700] [471] [INFO] Using worker: sync
[2019-04-07 10:23:16 -0700] [474] [INFO] Booting worker with pid: 474
2019-04-07 09:40:08,838 Exception on / [GET]
Traceback (most recent call last):
[...]
File "/home/[me]/breadsheet/venv/lib/python3.5/site-packages/sqlalchemy/engine/default.py", line 437, in connect
return self.dbapi.connect(*cargs, **cparams)
File "/home/[me]/breadsheet/venv/lib/python3.5/site-packages/psycopg2/__init__.py", line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/cloudsql/breadsheet:us-west1:breadsheet/.s.PGSQL.5432"?
The above exception was the direct cause of the following exception:
[line of code with the first database call in my app]
[...]
File "/home/[me]/breadsheet/venv/lib/python3.5/site-packages/psycopg2/__init__.py", line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/cloudsql/breadsheet:us-west1:breadsheet/.s.PGSQL.5432"?
尝试了以下(以及更多操作)无济于事:
env_variables
下对SQLALCHEMY_DATABASE_URI进行硬编码接下来要尝试什么?
答案 0 :(得分:1)
对于那些将来通过搜索阅读这些内容的人,我以前跳过了export SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://[USER]:[PW]@127.0.0.1:5432/[DB_NAME]
,因为我并不特别在意云外壳环境,并且认为它对部署没有影响。显然是这样。
稍后,在对Cloud Shell中的数据库连接进行故障排除时,我发现自己跳过了此两步命令sudo mkdir /cloudsql;
的第一部分(sudo mkdir /cloudsql; sudo chmod 777 /cloudsql
),因为我已经创建了/ cloudsql文件夹。我仍然不确定为什么需要命令的两个部分-尤其是在文件夹已经存在的情况下-但是如果没有这两个部分,数据库连接对我来说是行不通的。
更多说明:不需要在app.yaml中的SQLALCHEMY_DATABASE_URI
下设置env_variables:
,前提是您将该值设置为在应用的其他位置。添加到env_variables:
只会使该值作为易于访问的变量可用。