2016-10-13 59 views
1

我在这里看到了其他同一问题的帖子,但是没有一个答案对我有帮助。我有一个谷歌SQLCloud第二代数据库,我试图让我的Go Appengine应用程序建立连接。 我使用go-sql-driver/mysql使用Go on AppEngine连接到Google SQL Cloud第二代

起初,我试图用我的第一代只是路过的项目和实例名作为参数,使用相同的方式连接:

sql.Open("mysql", "[email protected](project:instance)/database" 

然后我从云发现控制台也从this post该地区也需要让我的连接参数现在看起来像:

sql.Open("mysql", "[email protected](project:uscentral1:instance)/database" 

,并与密码

sql.Open("mysql", "root:[email protected](project:uscentral1:instance)/database" 

仍然没有工作

我最后的尝试是使用SSL连接的使用从驱动程序文件提供的代码上this post描述:

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:[email protected](project:uscentral1:instance)/database?tls=custom") 

也没有运气。

在这一点上,我只是想尽办法解决问题。有没有人做过与大多数人所做的不同之处?此时,我不确定问题是否出现在我的代码中,驱动程序或CloudSQL数据库中的某些配置。

回答

0

原来我的项目没有AppEngine的默认凭据。控制台中的文档说,在创建项目时默认会创建默认的AppEngine和Compute Engine Credentials,但是此项目特别是通过旧App Engine控制台创建的,我的假设是当Google迁移AppEngine项目到新体系结构时,它还没有像我们现在创建一个新项目时那样创建默认凭证。 我已经删除了旧的项目,并创建了一个新的,一切正常。我想为旧项目创建正确的凭证也是可行的。 我在这里留下了这个答案,因为我只是依赖于文档,并且在检查明显之前实际上花了很多时间。对Google云端Doc人员来说,这可能是一个很好的建议。

0

请看下面的工作示例,并将其与您的应用程序中的内容进行比较。将INSTANCE_CONNECTION_NAME替换为Cloud Console中显示的“实例连接名称”或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", "[email protected](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() 
} 
+0

谢谢@Vadim。请看我上面的答案。 –

相关问题