Google App Engine Golang连接到Cloud SQL Postgres Unix Dial No此类



大家好,我在将我的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

相关内容

  • 没有找到相关文章

最新更新