大家好,我在将我的Golang应用程序连接到云SQL SQL Postgres实例时遇到了麻烦。我刚刚遵循了他们在Google Cloud平台和示例代码中的教程,但似乎无法正常工作。我只有两个文件app.yaml和main。
app.yaml
runtime: go api_version: go1 env: standard
env_variables: CLOUDSQL_CONNECTION_NAME: bxustl2019proj:asia-east1:sqlstlbxu CLOUDSQL_USER: ustldbbxu CLOUDSQL_PASSWORD: bxuuserstldb CLOUDSQL_DB: stlbxudbs
beta_settings:
cloud_sql_instances: bxustl2019proj:asia-east1:sqlstlbxu
handlers:
- url: /(.*.(gif|png|jpg))$ static_files: static/1 upload: static/.*.(gif|png|jpg)
- url: /.* script: _go_app
main.go
package dptest
import (
_"bytes"
"database/sql"
"fmt"
"log"
"net/http"
"os"
_ "github.com/lib/pq"
)
var db *sql.DB
func init() {
db = DB()
http.HandleFunc("/", indexHandler)
}
// DB gets a connection to the database.
// This can panic for malformed database connection strings, invalid credentials, or non-existance database instance.
func DB() *sql.DB {
/*
var (
connectionName = mustGetenv("CLOUDSQL_CONNECTION_NAME")
user = mustGetenv("CLOUDSQL_USER")
dbname = mustGetenv("CLOUDSQL_DB")
password = os.Getenv("CLOUDSQL_PASSWORD") // NOTE: password may be empty
socket = os.Getenv("CLOUDSQL_SOCKET_PREFIX")
)
//cloudsql is used on App Engine.
if socket == "" {
socket = "/cloudsql"
}
*/
// PostgreSQL Connection, uncomment to use.
// connection string format: user=USER password=PASSWORD host=/cloudsql/PROJECT_ID:REGION_ID:INSTANCE_ID/[ dbname=DB_NAME]
//dbURI := fmt.Sprintf("user=%s password=%s host=/cloudsql/%s database=%s", user, password, connectionName, dbname)
dbURI := fmt.Sprintf("user=ustldbbxu password=bxuuserstldb host=/cloudsql/bxustl2019proj:asia-east1:sqlstlbxu/stlbxudbs")
conn, err := sql.Open("postgres", dbURI)
log.Printf("CONNECTION: %v", conn)
if err != nil {
panic(fmt.Sprintf("DB: %v", err))
}
rows, err := conn.Query("SELECT * FROM GAMES")
log.Printf("ROW: %v", rows)
if err != nil {
log.Printf("Could not query db: %v", err)
}
defer rows.Close()
return conn
}
func indexHandler(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" {
http.NotFound(w, r)
return
}
w.Header().Set("Content-Type", "text/plain")
log.Printf("CONNECTION: %v", db)
rows, err := db.Query("SELECT * FROM GAMES")
log.Printf("ROW: %v", rows)
if err != nil {
log.Printf("Could not query db: %v", err)
http.Error(w, "Internal Error", 500)
return
}
defer rows.Close()
}
func mustGetenv(k string) string {
v := os.Getenv(k)
if v == "" {
log.Panicf("%s environment variable not set.", k)
}
return v
}
我尝试使用GO运行。和goapp服务。我也尝试添加appengine导入,但似乎没有任何作用,它一直在给我错误:
无法查询DB:DIAL UNIX /cloudsql/bxustl2019proj:asia-east1:sqlstlbxu/stlbxudbs/.s.s.pgsql.5432: 连接:没有这样的文件或目录
云SQL Admin也已启用。我只是评论了ENV以更轻松地运行该错误似乎是相同的,而不管要进行硬编码的查询路径或从YAML导入。
我希望有人可以帮助我。谢谢
看起来您正在与App Engine连接(但未指定标准或灵活的环境)。
如果您处于标准状态,则在/cloudsql/<INSTANCE_CONNECTION_NAME>
上自动可用UNIX插座。
如果您处于灵活性,则需要指定要连接到app.yaml中的实例,该实例需要在/cloudsql/<INSTANCE_CONNECTION_NAME>
处创建UNIX套接字。
这些Unix插座仅在运行时间本身中提供。如果您要在本地运行并要连接,则需要使用Cloud SQL代理在/cloudsql/<INSTANCE_CONNECTION_NAME>
上创建UNIX套接字(或更新连接字符串以使用公共IP并对其进行不同的方式进行身份验证)。
使用此设置的任何人。我有类似的布局。
- GCR使用Docker。
- Golang版本1.15
- orm sqlboiler
- Golang Dbapi
- CloudSQL使用PostgreSQL与公共IP一起仅使用CloudSQL代理可以到达,而GCR - &gt;Cloudsql被拒绝模型:无法插入用户:拨号TCP CloudSQL-IP:5432:连接:连接时间
第一步
部署实例
时gcloud run deploy foo --add-cloudsql-instances the-literal-instance-connection-name --update-env-vars INSTANCE_CONNECTION_NAME="the-literal-instance-connection-name" --image your-image-name --region $REGION --project your-project-id --service-account=the-service-account-you-run-your-things --platform managed --no-allow-unauthenticated
正在运行的该容器具有IAM角色云SQL客户端的服务帐户
sqlboiler的toml格式
- 主机=&quot;/cloudsql/literal-Instance-connection-name/&quort
Golang Lib/pq Golang DB API连接使用名为Unix Sock
- host =/cloudsql/literal-Instance-connection-name/
什么是literal-Instance-connection-name?
转到您的CloudSQL实例,然后查看列实例连接名称并将其用作值。
来源
- https://cloud.google.com/sql/docs/postgres/tutorial-connect-run#prepare_the_code
Google云文档中的Python示例
query_string = dict({"unix_sock": "/cloudsql/{}/.s.PGSQL.5432".format(connection_name)})
如果您在Golang中使用了类似格式,它将无法使用,经过多次试用和错误,我的版本正常。
例如,在两个连接中添加.s.pgsql.5432最终都以这样的错误
unable to insert into user: dial unix /cloudsql/the-literal-instance-connection-name/.s.PGSQL.5432/.s.PGSQL.5432: connect: not a directory