Flask SQLalchemy 无法使用 Unix 套接字连接到 Google Cloud Postgresql 数据库

Posted

技术标签:

【中文标题】Flask SQLalchemy 无法使用 Unix 套接字连接到 Google Cloud Postgresql 数据库【英文标题】:Flask SQLalchemy can't connect to Google Cloud Postgresql database with Unix socket 【发布时间】:2018-12-14 04:36:25 【问题描述】:

我在我的谷歌应用引擎标准环境项目中使用 Flask SQLalchemy 来尝试连接到我的 GCP Postgresql 数据库。 根据google docs,可以用这种格式创建url

# postgres+pg8000://<db_user>:<db_pass>@/<db_name>?unix_socket=/cloudsql/<cloud_sql_instance_name>

下面是我的代码

from flask import Flask, request, jsonify
import constants

app = Flask(__name__)

# Database configuration from GCP postgres+pg8000
DB_URL = 'postgres+pg8000://user:pw@/db?unix_socket=/cloudsql/instance_name'.format(user=user,pw=password,db=dbname, instance_name=instance_name)

app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # silence the 
deprecation warning
sqldb = SQLAlchemy(app)

这是我不断收到的错误:

File "/env/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 412, in connect return self.dbapi.connect(*cargs, **cparams) TypeError: connect() got an unexpected keyword argument 'unix_socket'

【问题讨论】:

【参考方案1】:

指定 unix 套接字的参数取决于您使用的驱动程序。根据pg8000 docs,你需要使用unix_sock而不是unix_socket

要在应用程序的上下文中查看此内容,您可以查看此sample application。

【讨论】:

感谢@kurtisvg,我尝试更改为 unix_sock 但我开始收到此错误,而不是第 1184 行,在 init 中引发 InterfaceError("communication error", e) sqlalchemy.exc。 InterfaceError: (pg8000.core.InterfaceError) ('communication error', ConnectionRefusedError(111, 'Connection denied')) (此错误的背景:sqlalche.me/e/rvf5) 我可以通过将 /cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432 添加到 url 来修复它【参考方案2】:

已经超过 1.5 年了,还没有人发布解决方案 :)

不管怎样,只要使用下面的 URI

postgres+psycopg2://<db_user>:<db_pass>@<public_ip>/<db_name>?host=/cloudsql/<cloud_sql_instance_name>

是的,不要忘记将您的系统公共 IP 地址添加到授权网络。

【讨论】:

使用flask_sqlalchemy 2.4.1版我最终得到一个错误-“无法加载插件:sqlalchemy.dialects:postgres.psycopg2”与该代码。将“postgres+psycopg2”更改为“postgresql” @buzz11 ***.com/questions/33794074/… 这应该可以解决您的问题。 通过云sql代理连接不需要添加任何授权网络,只需要一个公共IP。甚至还有一个组织策略不允许添加授权网络 sql.restrictAuthorizedNetworks,因此公共 IP 只能与代理一起使用。【参考方案3】:

文档示例

正如您在gcloud guides 中看到的,示例连接字符串是

postgres+pg8000://<db_user>:<db_pass>@/<db_name>?unix_sock=<socket_path>/<cloud_sql_instance_name>/.s.PGSQL.5432

不同的引擎和插座部件

请注意,引擎部分 postgres+pg8000 因您的数据库和使用的驱动程序而异。此外,根据您的数据库客户端库,可能需要或可以省略套接字部分 ?unix_sock=&lt;socket_path&gt;/&lt;cloud_sql_instance_name&gt;/.s.PGSQL.5432,如下所示:

注意:PostgreSQL 标准要求套接字路径中有 .s.PGSQL.5432 后缀。一些库会自动应用此后缀,但其他库要求您指定套接字路径,如下所示:/cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432。

PostgreSQL 和 flask_sqlalchemy

例如,我使用 PostgreSQL,flask_sqlalchemy 作为数据库客户端,pg8000 作为驱动程序,我的工作连接字符串只有postgres+pg8000://&lt;db_user&gt;:&lt;db_pass&gt;@/&lt;db_name&gt;

【讨论】:

以上是关于Flask SQLalchemy 无法使用 Unix 套接字连接到 Google Cloud Postgresql 数据库的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 flask-sqlalchemy 创建自动递增主键

AttributeError:使用flask-sqlalchemy连接到sqlite数据库时无法设置属性

Python Flask SQLAlchemy 容器无法连接到 MySQL 容器

Flask 和 Heroku sqlalchemy.exc.NoSuchModuleError:无法加载插件:sqlalchemy.dialects:postgres

Flask-SQLAlchemy 的隔离级别

Flask SQLAlchemy 无法连接到数据库