2016-10-13 6 views
1

Ich habe andere Beiträge mit dem gleichen Problem hier aber keine der Antworten konnte in meinem Fall helfen. Ich habe eine Google SQLCloud-Datenbank der 2. Generation, mit der ich versuchen möchte, dass meine Go Appengine App eine Verbindung herstellt. Ich verwende go-sql-driver/mysqlVerbinden mit Google SQL Cloud 2. Generation mit Go on AppEngine

Zuerst versuchte ich die gleiche Art und Weise zu verbinden ich mit der ersten Generation verwenden nur die Projekt- und Instanznamen als Parameter übergeben:

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

Dann habe ich aus der Cloud bemerkt habe, Konsole und auch von this post, dass die Region ist auch erforderlich, so dass meine Verbindungsparameter nun wie folgt aussehen:

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

und auch mit Passwort

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

Immer noch nicht

Mein letzter Versuch war arbeiten mit SSL zu verbinden, wie auf this post beschrieben mit dem Code aus der Treiber Dokumentation:

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") 

auch kein Glück.

An diesem Punkt sind mir nur die Ideen aus, was das Problem sein könnte. Hat jemand etwas anderes gemacht als die meisten Leute, um es zum Laufen zu bringen? An diesem Punkt bin ich mir nicht sicher, ob das Problem mit meinem Code, dem Treiber oder einer Konfiguration in der CloudSQL-Datenbank zusammenhängt.

Antwort

0

Es stellte sich heraus, dass mein Projekt nicht die Standardanmeldeinformationen für AppEngine hatte. Die Dokumentation in der Konsole besagt, dass bei der Projekterstellung standardmäßig die Standardanmeldeinformationen für AppEngine und Compute Engine erstellt werden. Dieses Projekt wurde jedoch vor einiger Zeit über die Old App Engine-Konsole erstellt. Ich gehe davon aus, dass Google AppEngine migriert hat Projekte auf die neue Architektur Es hat nicht die Standard-Anmeldeinformationen erstellt, wie wenn wir heutzutage ein neues Projekt erstellen. Ich habe das alte Projekt gelöscht und ein neues erstellt und alles funktioniert gut. Ich denke, das Erstellen der richtigen Anmeldeinformationen für das alte Projekt würde auch funktionieren. Ich lasse diese Antwort hier, weil ich mich nur auf die Dokumentation verlassen habe und tatsächlich viel Zeit damit verbracht habe, bevor ich das Offensichtliche überprüft habe. Es könnte ein guter Vorschlag für die Jungs von Google Cloud Doc sein, dies irgendwo zu dokumentieren.

0

Bitte nehmen Sie das folgende Arbeitsbeispiel und vergleichen Sie es mit dem, was Sie in Ihrer Anwendung haben. Ersetzen Sie INSTANCE_CONNECTION_NAME durch den in Cloud Console oder in gcloud sql describe angezeigten Namen der Instanzverbindung. Wenn Sie in Ihrer App nichts anderes bemerken, versuchen Sie, dieses Beispiel auszuführen und zu sehen, welchen Fehler Sie erhalten.

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

Dank @Vadim. Bitte sehen Sie meine Antwort oben. –

Verwandte Themen