通过App Engine使用Cloud SQL时,如何选择要查询的数据库?

时间:2018-02-06 10:57:10

标签: mysql google-app-engine google-cloud-sql

我收到以下错误:

Could not query db: Error 1046: No database selected

我理解错误消息的含义。但我还没能找到说明如何选择数据库的文档。

这是我的代码:

package main

import (
    "database/sql"
    "fmt"
    "log"
    "net/http"
    "os"
    "time"

    "google.golang.org/appengine"

    _ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

func main() {
    var (
        connectionName = mustGetenv("CLOUDSQL_CONNECTION_NAME")
        user           = mustGetenv("CLOUDSQL_USER")
        password       = os.Getenv("CLOUDSQL_PASSWORD")
    )

    var err error
    db, err = sql.Open("mysql ", fmt.Sprintf("%s:%s@cloudsql(%s)/", user, password, connectionName))
    if err != nil {
        log.Fatalf("Could not open db: %v", err)
    }

    http.HandleFunc("/", handler)
    appengine.Main()
}

func handler(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" {
        http.NotFound(w, r)
        return
    }

    w.Header().Set("Content-Type", "text/plain")

    rows, err := db.Query("INSERT INTO ping ( ping ) VALUES ( '" + time.Now().Format("2006-01-02 03:04:05") + "' );")
    if err != nil {
        http.Error(w, fmt.Sprintf("Could not query db: %v", err), 500)
        return
    }
    defer rows.Close()

    w.Write([]byte("OK"))
}

func mustGetenv(k string) string {
    v := os.Getenv(k)
    if v == "" {
        log.Panicf("%s environment variable not set.", k)
    }
    return v
}

1 个答案:

答案 0 :(得分:1)

您似乎指定了select date from table where date in (select distinct top 5 date from table where date >= getdate() order by date) ,但未指定CONNECTION_NAME。根据{{​​3}}(向下滚动到“GO> Companion进程”部分),您应该打开连接:

DB_NAME

这段代码与您的代码类似,但您没有指定import ( "github.com/go-sql-driver/mysql" ) dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s", dbUser, dbPassword, "127.0.0.1:3306", dbName) db, err := sql.Open("mysql", dsn) 参数。请记住,配置的其余部分应保持与您在代码中共享的相同,但您只需将数据库的名称附加到dbName函数的第二个参数。

在使用GO从the documentation连接的示例中,确定了相同的过程:

sql.Open()

所以我猜你应该尝试这个改变:

db, err = sql.Open("mysql", dbName)

我自己并不熟悉GoLang,但根据文档,这应该有效。