我尝试使用Gorm Golang连接到Google Cloudsql PostGressQL,并且似乎它不起作用。
这是代码
func InitDB() *gorm.DB {
psqlInfo := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", os.Getenv("DB_HOST"), os.Getenv("DB_PORT"), os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_NAME"))
db, err := gorm.Open("postgres", psqlInfo)
if err != nil {
fmt.Println("Failed to connect to the Database")
}
fmt.Println("Connected to the Database")
DB = db
return DB
}
如果我使用localhost confim confim,一切正常。请参阅我的.env文件以获取Cloudsql Config
DB_HOST=trader-234509:us-central1:testv1
DB_PORT=5432
DB_USER=username
DB_NAME=testv1
DB_PASSWORD=
错误在说
拨号TCP:Lookup Trader-234509:us-Central1:testv1:没有这样的主机 恐慌:运行时错误:无效的内存地址或零指针删除 [信号sigsegv:分割违规代码= 0x1 addr = 0x40 pc = 0x164681d]
我的本地配置(这可以正常工作)
DB_HOST=localhost
DB_PORT=5432
DB_USER=username
DB_NAME=test
DB_PASSWORD=
我做错了什么?
这是我从附录连接的方式:
import (
_ "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/postgres"
"fmt"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
func New() (*gorm.DB, error) {
user := "theuser"
password := "apassword"
dbHost := "my-project:the-region:my-db-instance-name"
databaseName := "mydbname"
connString := fmt.Sprintf("host=%s user=%s dbname=%s sslmode=disable password=%s", dbHost, user, databaseName, password)
return gorm.Open(postgres.New(postgres.Config{
DriverName: "cloudsqlpostgres",
DSN: connString,
}))
}
云SQL不支持第三方应用程序的实例名称的直接连接,有关详细信息:https://cloud.google.com/sql/docs/docs/mysql/mysql/connect-exnect-exnerth-app
根据我的经验,有2个解决方案:
-
根据上述指令,您可以按照步骤设置云代理,连接流将是:Golang App- app-> cloud Proxy-> cloud SQL这种方法是灵活的,您可以使用防火墙控制连接。
,但是您必须花费额外的$$来维护服务器,并且这个云代理实例,我还听说云代理可能存在一些性能问题,但到目前为止我还没有确切的证据 -
将私有IP分配到云SQL实例,请参阅https://cloud.google.com/sql/docs/mysql/mysql/private-ip,以便您可以直接使用此IP直接访问DB。
折衷很明显,该应用程序必须位于项目的同一网络中,但这是一种更方便的方法,尤其是。您的所有应用程序均托管在同一网络
我没有尝试公共IP访问方法,因为如果需要远程网络连接,云代理只是我需要的
简而
希望它能有所帮助