2016-12-03 1 views
0

Love the Stack, 완전 좌절에서 첫 번째 게시물을 사랑해. 댓글 주셔서 감사합니다!App Engine에서 CloudSQL에 연결 (Second Generation CloudSQL) GO

  • 프로젝트
  • 이 앱 엔진에서 MySQL 인스턴스
  • 에서 데이터베이스 등재 2 세대 MySQL 인스턴스 내 앱 엔진에서 앱 엔진 프로젝트
  • , 나는 활성화 생성됨 -> 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 표준 문서/게시물을 읽는 것으로 의심됩니다. 확인해주세요. – Vadim

+0

Google Cloud Shell에서 작업하고 있습니다. 프로그램을 만들고, 빌드하고, 실행하십시오. 솔루션을 배포하고 yaml에 추가하기 전까지 Flex를 사용할 수있는 옵션이 아직 없습니다. 나는 모든 GO 예제를 실행하면서이 클라우드 쉘 환경을 수행해 왔습니다. 이제 SQL을 클라우드에 연결하고 문제가 발생했습니다. 나는 이제 내가 구글 클라우드 쉘을 상대로 싸우고 있다고 생각한다. 나는 앱을 배포하고 오늘 밤에 플렉스를 켜고 결과를 게시 할 것이다. 아래의 연결 문자열은 클라우드 셸에서 작동하지 않지만 최소한 플렉스 연결 문자열은 나에게 새로운 메시지를 제공합니다 ... 같은 파일 디렉토리가 없습니다. –

+0

게시물에서 더 명확하게 작성해야합니다. 이 경우 App Engine에서 연결하기위한 것이므로 ** App Engine 지침을 따르지 않아도됩니다 **. Cloud Shell에서 연결하는 것은 좀 더 복잡합니다. 연결하려면 (App Engine Flex에서 게시 한 동일한 연결 문자열을 사용하여) 셸에 Cloud SQL Proxy를 다운로드하여 실행해야합니다. – Vadim

답변

7

올바른 연결 문자열은 다음과 같지만 연결되는 App Engine의 버전에 따라 다릅니다.

앱 엔진 표준 :

user:[email protected](INSTANCE_CONNECTION_NAME)/dbname 

앱 엔진 유연성 :

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

감사합니다. Vadim을 사용하면 도움이되었습니다. 배포 된 응용 프로그램 엔진 flex 환경에서 작동하는 유닉스 연결 문자열이 있습니다. 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

새로운 사람들이 이동을 위해, 앱 엔진 및 CloudSQL 그냥 연결하는 간단한 GO 프로그램을 작성하고 CloudSQL 2nd Gen 데이터베이스와 통신하는 것은 실망 스럽습니다!

App Eng 또는 App Eng Flex는 SQL 1 차 또는 2 차 SQL을 선택할 수 있습니다. 조합에 따라 문자열이 다릅니다. 검색 할 때 Google의 모든 문서는 flex를 사용하지 않고 1 세대 SQL 및 App Engine으로 이동합니다. 이는 주로 프로덕션 환경에 있기 때문입니다. Flex 문서를 읽었는지 확인하십시오. 그렇게한다면 2nd Gen 문서를 읽는지 확인하십시오. 때로는 완전히 다른 문서이고, 때로는 문서가 페이지에 쌓여 있고 최신 자료 인 2 세대 SQL 및 app eng flex에 대해 아래쪽으로 이동해야합니다.

CloudShell은 까다 롭습니다. 아직 GO를 컴파일 할 수없고 SQL 2와 대화 할 수 없습니다. 나는 성공적으로 SQL PROXY RUNNING을 사용하여 배포 된 응용 프로그램 엔진 플렉스에서 2 SQL SQL을 클라우드로 돌리고 있는데 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") 
} 

} 
관련 문제