首页 > 解决方案 > 在 google cloud sql server 中使用 flasksql alchemy 创建数据库

问题描述

我尝试从 Windows 本地机器连接到 gcp postresql SQL-server 中的数据库。我连接了这样的命令:

cloud_sql_proxy -instances=<myProject:us-central1:myInstance>=tcp:0.0.0.0:8080 
& 
psql -U postgres -h <Public IP address>

现在我需要使用sqlalchemy. 我试过了

app.config["SQLALCHEMY_DATABASE_URI"] = 'postgres+psycopg2://<db_user>:<db_pass>@<Public IP address>/<myInstance>?host=<myProject:us-central1:myInstance>'

命令后flask db migrate我得到一个错误:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "<myProject:us-central1:myInstance>" to address: Unknown host

然后我尝试在 myProject:us-central1:myInstance 的末尾创建 / 我得到了另一个错误

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Invalid argument (0x00002726/10022)
        Is the server running locally and accepting
        connections on Unix domain socket "?host=<myProject:us-central1:myInstance>//.s.PGSQL.8080"?

最后我输入.s.PGSQL.8080并得到了同样的错误:

server: Invalid argument (0x00002726/10022)
            Is the server running locally and accepting
            connections on Unix domain socket "?host=<myProject:us-central1:myInstance>//.s.PGSQL.8080/.s.PGSQL.8080"?

请告诉我我应该如何解决我的问题?

标签: pythonpostgresqlflaskflask-sqlalchemygoogle-cloud-sql

解决方案


SQLAlchemy 只想使用实例的 IP,而不是连接名称。它不知道如何将连接名称(带有 <project_id>:<region>:<instance_id> 的位)转换为要连接的实例。这是代理所做的事情之一。

所以你有几个选择:

  1. 继续按您的方式使用代理,尽管我不会将 tcp 设置为 0.0.0.0:8080,因为这不是您想要连接到 SQL 数据库的常用方式。我会这样做:cloud_sql_proxy -instances=<myProject:us-central1:myInstance>=tcp:5432 &。然后在您的 SQLAlchemy 代码中进行连接,就好像您在本地连接到数据库一样。当您启动代理时,您应该会收到类似“正在侦听端口 127.0.0.1:5432”的消息。这就是您的应用程序将连接到的内容。

  2. 从 SQLAlchemy 直接连接到数据库。如果您的数据库设置为公共 IP,您可以在 Google Cloud Console 中授权您想要连接的网络(或命令行,如果您习惯使用 gcloud 工具在命令行上)。如果你走这条路,你会从你的 Cloud SQL 实例的概述页面中获取公共 IP,并在连接代码中使用它。

我强烈推荐选项 1,因为选项 2 本身并没有很多安全措施。您必须自己添加安全性,例如,将您的实例设置为仅使用 SSL 连接,然后生成密钥并在 SQLAlchemy 代码中使用私钥来确保安全连接。代理会为您处理所有这些。


推荐阅读