2016-12-03 20 views
0

Love the Stack、完全な欲求不満から私の最初の投稿。コメントありがとう! App EngineのではMySQLインスタンス内のデータベース App Engine(第2世代CloudSQL)からCloudSQLに接続するGO

  • を作成し、私のApp Engineプロジェクト
  • に第二世代のMySQLインスタンスを作成したのApp Engineプロジェクト
  • を作成し

    • 、私はアクティブ - > Googleクラウドシェル<を - - 。 (私は私のconsole.cloud.google.comのコマンドプロンプトで作業しています)

    私はこの基本的なGOプログラムをコピーしてMySQLインスタンスに接続しました。

    ビルドして実行します。 ビルドmysqlexample.go ./mysqlexample

    正常に接続することができませんでした。私が試したさまざまな接続文字列をすべて見ることができ、その右側には私が得る応答があります。

    ローカルのWindowsマシンからmysql adminを使用して接続できます。

    ヘルプ?

    package main 
    
    import (
        "database/sql" 
        _ "github.com/go-sql-driver/mysql" 
        "log" 
        ) 
    
    func main() { 
    
        const dbIP = "104.xxx.xx.x" 
        const dbInstanceName = "esp-1-dev:us-central1:espdev" 
        const dbName = "servpro" 
        const dbUserName = "root" 
        const dbPassword = "xxxxxxx" 
    
        const dbOpenString = dbUserName + ":" + dbPassword + "@/" + dbInstanceName + "/" + dbName //GETS RESPONSE default addr for network 'AppEngine:Zone:Project' unknown 
        //const dbOpenString = dbUserName + "@cloudsql(" + dbInstanceName + ")/" + dbName //GETS RESPONSE dial cloudsql: unknown network cloudsql 
        //const dbOpenString = dbUserName + "@/" //+ "?parseTime=true&loc=UTC"     //GETS RESPONSE getsockopt: connection refused 
        //const dbOpenString = dbUserName + ":" + dbPassword + "@tcp(" + dbIP + ":3306)/" + dbName //GETS RESPONSE dial tcp 104.xxx.xxx.x:3306: getsockopt: connection timed out 
    
        // Got this from stack overflow. GoDocs are not updated to reflect 2nd Gen databases. 
        // http://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error-with-google-cloud-sql-2nd 
        //user:[email protected](copiedPastedInstanceConnectionName)/d‌​atabaseName?charset=‌​charset&collation=co‌​llation&tls=tlsConfi‌​gName&parseTime=true 
        //First Generation Connection String  
         //username:[email protected](appID:CloudSQLInstance)/databasename?parseTime=true&loc=UTC 
    
        db, err := sql.Open("mysql", dbOpenString); 
        defer db.Close() 
    
        log.Println("Attempting Ping of database....") 
    
        err = db.Ping() 
    
        if err != nil { 
         log.Println("db.Ping() failed: " + dbOpenString) 
         log.Println(err) 
        } else { 
         log.Println("Success!") 
        } 
    
    } 
    
  • +0

    あなたは、App Engine StandardまたはApp Engine Flexから接続しているかどうかは言いませんでした。あなたはApp Engine Flexから接続していますが、App Engine Standardのドキュメント/投稿を読んでいると思います。ご確認ください。 – Vadim

    +0

    Google Cloud Shellで作業しています。プログラムを作り、ビルドして実行してください。ソリューションを展開してyamlに追加するまで、Flexを使用するオプションはまだありません。私は、すべてのGOの例を使ってこのクラウドシェル環境を行ってきました。今、私はクラウドSQLと話をして行きたいです。私は今、私はGoogleのクラウドシェルと戦っていると思う。私は自分のアプリを配備し、今晩はフレックスをオンにして結果を投稿します。以下の接続文字列はクラウドシェルでは動作しませんが、少なくともフレックス接続文字列は私に新しいメッセージを与えます。そのようなファイルディレクトリはありません –

    +0

    あなたの投稿にもっと明確にする必要があります。その場合、App Engineからの接続のためのApp Engineの指示に従う必要はありません** **。クラウドシェルからの接続はもう少し複雑なので、クラウドSQLプロキシをシェルにダウンロードして実行する必要があります(App Engine Flexから投稿したのと同じ接続文字列を使用) – Vadim

    答えて

    7

    以下は正しい接続文字列ですが、接続するApp Engineのバージョンによって異なります。

    App Engineの標準:

    user:[email protected](INSTANCE_CONNECTION_NAME)/dbname 
    

    App Engineの柔軟性:

    user:[email protected](/cloudsql/INSTANCE_CONNECTION_NAME)/dbname 
    
    +0

    Vadimありがとうございました。私は、デプロイされたアプリケーションエンジンflex環境で動作するUNIX接続文字列を持っています。私はまだGoogle Cloud Shellでブロックされていますが、これをうれしく思います。これは私の接続文字列の例を検索して得たGoogleドキュメントの中で最も役に立つページでした。 https://cloud.google.com/appengine/docs/flexible/go/using-cloud-sql –

    1

    https://cloud.google.com/appengine/docs/flexible/go/using-cloud-sql

    新しい人々が行くの、App EngineとCloudSQLだけで接続するための最も簡単なGOプログラムを書き込み、あなたのCloudSQL 2nd Genデータベースと通信することはイライラしています!

    あなたは、App EngまたはApp Eng Flex、SQL 1stまたは2nd Genを選択することができます。接続の組み合わせによって、文字列が異なります。検索時のGoogleのドキュメントはすべて、第一世代のSQLとApp Engineをflexなしで動かすことができます。これは主にプロダクションであるためです。あなたがそれをしている場合は、Flexのドキュメントを読んでいることを確認してください。それを行う場合は、第2世代のドキュメントを読んでいることを確認してください。時にはそれらはまったく別のドキュメントであることがあります。ドキュメントがページに積み重ねられている場合、新しいものについては2nd gen sqlとapp eng flexについては下を参照してください。

    CloudShellは難しいですが、私はまだGOをコンパイルできず、ここでSQL 2ndと話します。私は、SQL PROXY RUNNINGを使用して、SQL PROXYを使用する必要があります。あなたはappengineとSQL上のこのユーザーを作成するためのセットアップを行う必要があります。

    これは私の働くプログラムです。

    package main 
    
    import (
    "database/sql" 
    _ "github.com/go-sql-driver/mysql" 
    "log" 
    "fmt" 
    "net/http" 
    ) 
    
    func healthCheckHandler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprint(w, "ok") 
    } 
    
    func main() { 
    http.HandleFunc("/", handle) 
    http.HandleFunc("/_cloudshellProxy/_ah/health", healthCheckHandler) 
    log.Print("Listening on port 8080") 
    log.Fatal(http.ListenAndServe(":8080", nil)) 
    } 
    
    
    func handle(w http.ResponseWriter, r *http.Request) { 
    
    const dbIP = "104.xxx.xxx.x" 
    const dbInstanceName = "projectname:us-central1:sqlinstance" 
    const dbName = "servxxx" 
    const dbUserName = "sqlproxysuser" 
    const dbPassword = "xxxRockxxx" 
    
    
    if r.URL.Path != "/" { 
        http.NotFound(w, r) 
        return 
    } 
    fmt.Fprint(w, "Hello SQL! Hello?") 
    fmt.Fprint(w, "\n") 
    
    const dbOpenString = dbUserName + ":" + dbPassword + "@unix(/cloudsql/" + dbInstanceName + ")/" + dbName 
    //const dbOpenString = dbUserName + ":" + dbPassword + "@cloudsql(" + dbInstanceName + ")/" + dbName 
    
    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
    //-=- SQL OPEN Statement, per docs, DOES NOT return an error ever 
    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
    db, err := sql.Open("mysql", dbOpenString); 
    defer db.Close() 
    
    err = db.Ping() 
    if err != nil { 
        fmt.Fprint(w, "Failed Connection" + " " + dbOpenString) 
        fmt.Fprint(w, "\n") 
        fmt.Fprint(w, err) 
        return 
    } else { 
        fmt.Fprint(w, "SUCCESSFUL CONNECTION" + " " + dbOpenString) 
        fmt.Fprint(w, "\n") 
    } 
    
    _, err = db.Exec("CREATE TABLE IF NOT EXISTS exercisecloudsql101 (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, description TEXT, PRIMARY KEY (id))") 
    if err != nil { 
        fmt.Fprint(w, "CREATE TABLE failed:") 
        fmt.Fprint(w, "\n") 
        fmt.Fprint(w, err) 
        fmt.Fprint(w, "\n") 
    } else { 
        fmt.Fprint(w, "SUCCESSFUL CreateTable" + " " + dbOpenString) 
        fmt.Fprint(w, "\n") 
    } 
    
    } 
    
    関連する問題