【问题标题】:Golang: Accessing Google App Engine CloudSQLGolang:访问 Google App Engine CloudSQL
【发布时间】:2015-05-17 01:54:43
【问题描述】:

新问题:我在 Google 上找到的所有内容都表明 CloudSQL 连接器应该可以工作,但源代码本身除外(并且导入 SDK 的 cloudsql 不起作用)。有没有什么地方可以找到这个更新的库(如果存在)?

---编辑:我有我的答案:似乎问题出在 CloudSQL 本身而不是驱动程序或类似的东西上。---

我正在尝试从 Google App Engine Go 程序访问 CloudSQL。 我已经使用 Go 1.2.1 和 Go 1.4.2 尝试了 go-sql-driver/mysql 和 ziutek/mymysql。我已经尝试了 go-sql-driver 的 go get 版本,并直接从 Github 克隆了它。我已经尝试了 App Engine 安装程序和存档。

每次我尝试使用我的应用程序访问数据库时,生成的网页都会显示: cloudsql:开发中尚不支持

我在这里看到了另一个类似的问题,尝试了那里提到的所有内容,但都没有奏效。

有问题的代码:

    import (
    _ "github.com/go-sql-driver/mysql"
    _ "appengine/cloudsql"
    "database/sql"
    "net/http"
)

func adminLogin(w http.ResponseWriter, r *http.Request) {
    username := formatter(r.FormValue("username"))
    password := formatter(r.FormValue("password"))
    db, err := sql.Open("mysql",
        "root:password@cloudsql(ws-virtual-classroom:database)/logins") // And all the variations on that string I could think of...
    defer db.Close()
    if err != nil {
        log.Print(err)
    } else {
        rows, err := db.Query("SELECT username FROM admin_logins WHERE username=? AND password=? LIMIT 1", username, password)
        defer rows.Close()
        if err != nil {
            log.Print(err)
        } else {
            var user string
            for rows.Next() {
                err = rows.Scan(&user)
                if err != nil {
                    log.Print(err)
                } else {
                    makeCookie(w, r, user, true, true)
                }
            }
        }
    }
    teachersHome(w, r)
}

结果(在我提交登录表单后显示在我的浏览器中):

the runtime process gave a bad HTTP response: ''

2015/05/17 01:53:06 cloudsql: not supported in dev yet
2015/05/17 01:53:06 http: panic serving 127.0.0.1:56970: runtime error: invalid memory address or nil pointer dereference
goroutine 12 [running]:
net/http.func·011()
    /tmp/appengine/go_appengine/goroot/src/net/http/server.go:1130 +0xbb
database/sql.(*Rows).Close(0x0, 0x0, 0x0)
    /tmp/appengine/go_appengine/goroot/src/database/sql/sql.go:1659 +0x31
main57750.adminLogin(0x7f76a72ef5d8, 0xc208045860, 0xc2080c4820)
    main.go:208 +0x25a
net/http.HandlerFunc.ServeHTTP(0x927c78, 0x7f76a72ef5d8, 0xc208045860, 0xc2080c4820)
    /tmp/appengine/go_appengine/goroot/src/net/http/server.go:1265 +0x41
github.com/gorilla/mux.(*Router).ServeHTTP(0xc20800c730, 0x7f76a72ef5d8, 0xc208045860, 0xc2080c4820)
    /home/daniel/go/src/github.com/gorilla/mux/mux.go:98 +0x297
net/http.(*ServeMux).ServeHTTP(0xc20803a6f0, 0x7f76a72ef5d8, 0xc208045860, 0xc2080c4820)
    /tmp/appengine/go_appengine/goroot/src/net/http/server.go:1541 +0x17d
appengine_internal.handleFilteredHTTP(0x7f76a72ef5d8, 0xc208045860, 0xc2080c4820)
    /tmp/appengine/go_appengine/goroot/src/appengine_internal/api_dev.go:98 +0x413
net/http.HandlerFunc.ServeHTTP(0x927248, 0x7f76a72ef5d8, 0xc208045860, 0xc2080c4820)
    /tmp/appengine/go_appengine/goroot/src/net/http/server.go:1265 +0x41
net/http.serverHandler.ServeHTTP(0xc208042540, 0x7f76a72ef5d8, 0xc208045860, 0xc2080c4820)
    /tmp/appengine/go_appengine/goroot/src/net/http/server.go:1703 +0x19a
net/http.(*conn).serve(0xc2080457c0)
    /tmp/appengine/go_appengine/goroot/src/net/http/server.go:1204 +0xb57
created by net/http.(*Server).Serve
    /tmp/appengine/go_appengine/goroot/src/net/http/server.go:1751 +0x35e

这是使用 goapp serve 运行它时。如果我部署它,我似乎遇到了同样的问题——结果页面是空白的,而不是显示该文本,但日志错误消息是相同的。

【问题讨论】:

    标签: google-app-engine go


    【解决方案1】:

    更新的库在这里:https://godoc.org/google.golang.org/appengine。虽然它没有 CloudSQL。也许你应该只在本地使用常规的 mysql 连接:

    func dialSQL() (*sql.DB, error) {
        if appengine.IsDevAppServer() {
            // or sql.Open("mysql", "user-name:password@ip-address-of-google-cloud-sql-instance/dbname")
            return sql.Open("mysql", "user:password@/dbname")
        }
        return sql.Open("mysql", "cloudsql:my-instance*dbname/user/passwd")
    }
    

    使用本地数据库通常是最佳选择,因为连接到实时数据库可能非常危险。例如,很容易意外地对生产数据库运行测试并丢弃所有内容。

    尽管如此,Google 在此处提供了连接到 CloudSQL 的说明:https://cloud.google.com/sql/docs/introduction。第三方工具的说明也适用于 Go。

    【讨论】:

      【解决方案2】:

      我不认为 cloudsql 做任何事情?无论如何,源代码看起来都会返回该错误,哈哈

      https://code.google.com/p/appengine-go/source/browse/appengine/cloudsql/cloudsql.go

      // Dial connects to the named Cloud SQL instance.
          func Dial(instance string) (net.Conn, error) {
                  return connect(instance)
          }
      

      https://code.google.com/p/appengine-go/source/browse/appengine/cloudsql/cloudsql_dev.go

      func connect(instance string) (net.Conn, error) {
              return nil, errors.New("cloudsql: not supported in dev yet")
      }
      

      【讨论】:

      • 好吧,没错,肯定是cloudsql,而不是驱动什么的。
      猜你喜欢
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 2021-07-07
      • 2016-05-19
      • 1970-01-01
      • 2012-09-30
      相关资源
      最近更新 更多