0

升级到 Gorm 版本后:

gorm.io/driver/postgres v1.0.2  
gorm.io/gorm v1.20.2

无法连接到 Google Cloud SQL PostgreSQL v12

该连接在旧 GORM 版本上没有问题,具有:

db, err := gorm.Open("postgres", "host=/cloudsql/project_id:us-central1:sql_instance_name port=5432 user=... dbname=... password=... sslmode=disable")   

新的 GORM 版本适用于 localhost_golang / localhost_postgres 的本地安装(mac)

谷歌云上的代码:

dsn := ""  
dsn += "user=postgres "  
dsn += "password=admin_password_here "  
dsn += "host=/cloudsql/project_id:us-central1:sql_instance_name "  
dsn += "dbname=db_name "  
dsn += "port=5432 "  
dsn += "sslmode=disable "  
fmt.Println("dsn:%v", dsn)

db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{   
    NamingStrategy: schema.NamingStrategy{  
        SingularTable: true,  
    }, 
})

谷歌云上的错误:
[0m [31m [错误] [0m无法初始化数据库,出错无法连接host=/cloudsql/project_id:us-central1:sql_instance_name user=postgres database=db_name:拨号错误(拨号unix /cloudsql/project_id:us-central1:sql_instance_name/.s.PGSQL.5432:连接:拒绝连接)

谢谢!

4

1 回答 1

0

App Engine 默认服务帐户需要适当的角色,即使 CLoud SQL Connections 页面显示“App Engine 授权”,此项目中的所有应用程序都默认授权。 https://cloud.google.com/sql/docs/postgres/connect-app-engine-standard?_ga=2.121100104.-1170262708.1601472976

要配置 App Engine 标准环境以启用与使用公共 IP 的 Cloud SQL 实例的连接:

确保上面创建的实例具有公共 IP 地址。您可以在 Google Cloud Console 中的实例的概览页面上验证这一点。如果您需要添加一个,请参阅配置公共 IP 页面以获取说明。

为您的实例获取 INSTANCE_CONNECTION_NAME。这可以在 Google Cloud Console 中您的实例的概览页面上找到。或者通过运行以下命令:gcloud sql instances describe [INSTANCE_NAME]。

确保您的应用用于验证对 Cloud SQL 的调用的服务帐号具有适当的 Cloud SQL 角色和权限。您的服务的服务账户需要以下 IAM 角色之一:

- Cloud SQL Client (preferred)  
- Cloud SQL Editor  
- Cloud SQL Admin  

或者,您可以手动分配以下 IAM 权限:

- cloudsql.instances.connect  
- cloudsql.instances.get   

有关将 IAM 角色添加到服务账户的详细说明,请参阅向服务账户授予角色。默认情况下,您的应用将使用 App Engine 服务帐户授权您的连接。服务帐户身份的格式为 PROJECT_ID@appspot.gserviceaccount.com。

如果授权服务帐号与 Cloud SQL 实例属于不同的项目,则需要为这两个项目添加 Cloud SQL Admin API 和 IAM 权限。

于 2020-10-12T19:25:18.993 回答