Google App Engine Golang подключиться к облаку SQL Postgres unix не набирать такой файл или каталог - PullRequest
2 голосов
/ 17 марта 2019

Всем доброго времени суток, у меня проблемы с подключением моего приложения golang к экземпляру облака SQL Postgres.Я только что ознакомился с их учебником в Google Cloud Platform и примером кода, но, похоже, он не работает.У меня есть только два файла app.yaml и main.go только для проверки соединения:

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
}

Iпопытался использовать Go Run.и goapp служить.Я попытался добавить импорт appengine также, но, похоже, ни один из них не работает, и он продолжает выдавать ошибку:

Не удалось запросить db: dial unix / cloudsql / bxustl2019proj: asia-east1: sqlstlbxu / stlbxudbs/.s.PGSQL.5432: connect: нет такого файла или каталога

Cloud SQL Admin также включен.Я только что закомментировал env для более легкого запуска, ошибка кажется одинаковой независимо от жесткого кодирования пути запроса или импорта из yaml.

Я надеюсь, что кто-то может помочь мне в этом. Спасибо.

1 Ответ

0 голосов
/ 18 марта 2019

Похоже, вы подключаетесь с помощью App Engine (но вы не указываете Стандартные или Гибкие среды).

Если вы используете Standard, сокет unix автоматически доступен на /cloudsql/<INSTANCE_CONNECTION_NAME>.

Если вы используете Flexible, вам нужно указать экземпляр, к которому вы хотите подключиться, в app.yaml, который должен будет создать сокет unix на /cloudsql/<INSTANCE_CONNECTION_NAME>.

Эти сокеты Unix предоставляются только в самих средах выполнения . Если вы работаете локально и хотите подключиться, вам нужно будет использовать Cloud SQL proxy , чтобы создать сокет unix на /cloudsql/<INSTANCE_CONNECTION_NAME> (или обновить строку подключения для использования Public IP и аутентификации другим способом). .

...