2016-10-13 61 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。請看我上面的答案。 –

相關問題