我想将flask_sqlalchemy与GCP的数据库连接器一起使用,它可以按照此处所述进行自动TLS设置:https://cloud.google.com/sql/docs/postgres/connect-connectors#python_1
我在我的笔记本电脑上尝试了他们的示例代码,并通过 GOOGLE_APPLICATION_CREDENTIALS 设置了凭据,并且它有效。它能够连接到GCP上的远程数据库,我检查它是否使用wireshark进行了TLS加密,它成功地从数据库查询了数据。我用 sqlalchemy 1.4.47 运行了它。
我想将 GCP 连接器与使用 SQLALCHEMY_BINDS 的 Flask + Flask_sqlalchemy 应用程序一起使用。使用 sqlalchemy 1.4.47flask_sqlalcehmy 2.5.1 和如下代码:
...
from flask_sqlalchemy import SQLAlchemy
from google.cloud.sql.connector import Connector, IPTypes
import pg8000
...
db: SQLAlchemy = SQLAlchemy()
def create_web_app():
app = Flask('ex')
...
ip_type = IPTypes.PUBLIC
connector = Connector()
def getconn() -> pg8000.dbapi.Connection:
conn: pg8000.dbapi.Connection = connector.connect(
app.config["GCPTSLPROTECTED_INSTANCE_CONNECTION_NAME"],
"pg8000",
user=app.config["GCPTSLPROTECTED_DB_USER"],
password=app.config["GCPTSLPROTECTED_DB_PASS"],
db=app.config["GCPTSLPROTECTED_DB_NAME"],
ip_type=ip_type,
)
return conn
app.config["SQLALCHEMY_BINDS"] = {
"gcptslprotected": {
# This URI looks funny but is what GCP docs request and works in the test script
"url": make_url("postgresql+pg8000://"),
"creator": getconn }
}
...
# SQLALCHEMY_URI for a default db connection also gets created and works fine
app.config['SQLALCHEMY_URI'] = "sqlite:///./tests/data/test.db"
db.init_app(app)
...
上面的代码运行良好,但随后 Flask 应用程序中的路由使用数据库,从而引发此错误:
File "/home/bdc34/.pyenv/versions/browse310/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 516, in create_engine
u, plugins, kwargs = u._instantiate_plugins(kwargs)
AttributeError: 'dict' object has no attribute '_instantiate_plugins'
您可能会注意到我使用了 make_url(),而 GCP 示例脚本则没有。我这样做是为了解决由flask_sqlalchemy函数引发的异常
apply_driver_hacks()
,这不是最鼓舞人心的名字。
我已成功复制您的问题。为了解决这个问题,我按照连接到 Cloud SQL for PostgreSQL 的快速入门进行操作。请注意,从其他服务(私有 IP、Cloud SQL Auth 代理、Cloud Run、Cloud Functions 等)连接还有其他步骤,可以在左侧窗格中找到。
以下是连接到 Cloud SQL for PostgreSQL 时需要检查的一些步骤:
gcloud services enable sqladmin.googleapis.com
命令以启用本快速入门所需的 API。instance_connection_name
、db_user
、db_pass
、db_name
) 正确。pip install -r requirements.txt
以安装所需的依赖项。您可以通过此 Github 链接检查其他步骤。gcloud sql connect [myinstance] --user=postgres
。这提示我输入实例的密码。连接到 Cloud Shell 时出现以下内容:
Allowlisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [db_user].Password:
psql (15.4 (Debian 15.4-1.pgdg110+1), server 14.7)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
postgres=>
出于某种奇怪的原因,我重复了此步骤大约 9-10 次,因为我在部署项目时遇到了不同的错误。
如果上述步骤不起作用,您还可以提交错误,或者联系 Google Cloud 支持以获得有关您的问题的其他帮助。
如果成功请告诉我。