我在这里看到过同样问题的其他帖子,但是在我的情况下,没有一个答案可以提供帮助。我有一个Google SQLCloud第二代数据库,我正在尝试让我的Go Appengine应用程序建立连接。 我正在使用go-sql-driver/mysql
起初我试图以与第一代相同的方式连接,只是将项目和实例名称作为参数传递:
sql.Open("mysql", "root@cloudsql(project:instance)/database"
然后我从云端控制台和this post注意到该区域也是必需的,因此我的连接参数现在如下所示:
sql.Open("mysql", "root@cloudsql(project:uscentral1:instance)/database"
并且还有密码
sql.Open("mysql", "root:password@cloudsql(project:uscentral1:instance)/database"
仍然无法正常工作
我的最后一次尝试是使用驱动程序文档中提供的代码按this post所述使用SSL进行连接:
rootCertPool := x509.NewCertPool()
pem, err := ioutil.ReadFile("/path/ca-cert.pem")
if err != nil {
log.Fatal(err)
}
if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
log.Fatal("Failed to append PEM.")
}
clientCert := make([]tls.Certificate, 0, 1)
certs, err := tls.LoadX509KeyPair("/path/client-cert.pem", "/path/client-key.pem")
if err != nil {
log.Fatal(err)
}
clientCert = append(clientCert, certs)
mysql.RegisterTLSConfig("custom", &tls.Config{
RootCAs: rootCertPool,
Certificates: clientCert,
})
sql.Open("mysql","root:password@cloudsql(project:uscentral1:instance)/database?tls=custom")
也没有运气。
在这一点上,我只是在想出问题的可能性。有没有人做过与大多数人做的不同的事情才能让它发挥作用?此时我不确定问题是否与我的代码,驱动程序或CloudSQL数据库中的某些配置有关。
答案 0 :(得分:0)
请使用以下工作示例并将其与您在应用程序中的示例进行比较。将INSTANCE_CONNECTION_NAME替换为"实例连接名称"显示在云端控制台或gcloud sql describe
中。
如果您没有注意到应用中存在任何不同之处,请尝试运行此示例并查看您获得的错误。
package hello
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"net/http"
)
func init() {
http.HandleFunc("/", handler)
}
func handler(w http.ResponseWriter, r *http.Request) {
db, err := sql.Open("mysql", "root@cloudsql(INSTANCE_CONNECTION_NAME)/mysql")
if err != nil {
fmt.Fprintf(w, "Error constructing DB: %v", err)
return
}
rows, err := db.Query("SELECT 1")
if err != nil {
fmt.Fprintf(w, "Error performing query: %v", err)
return
}
fmt.Fprintf(w, "Success!")
rows.Close()
}
答案 1 :(得分:0)
原来我的项目没有AppEngine的默认凭据。控制台中的文档说,在项目创建时,默认情况下会创建默认的AppEngine和Compute Engine凭据,但是这个项目特别是之前通过Old App Engine控制台创建的,我的假设是当Google迁移AppEngine时项目到新架构时,它没有创建默认凭据,就像我们现在创建一个新项目时那样。 我删除了旧项目并创建了一个新项目,一切正常。我想为旧项目创建正确的凭据也会有效。 我在这里留下这个答案是因为我只是依靠文档而实际上花了很多时间来检查明显的问题。对于Google Cloud Doc的人来说,在某个地方记录这一点可能是一个很好的建议。