2016-12-03 3 views
0

Любите стек, Мой первый пост из полного разочарования. Спасибо за ваши комментарии!Подключение к CloudSQL из App Engine (второе поколение CloudSQL) GO

  • создал приложение Project Engine
  • создания второго поколения MySQL Instance в моем App Engine Project
  • создания базы данных в MySQL Instance
  • В App Engine, я активировать -> Google Cloud Shell < - -. (Я работаю в командной строке на моей консоли.cloud.google.com)

Я скопировал эту базовую программу GO для подключения к моему экземпляру MySQL.

Я строю его и запускаю. go build 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. Сделайте программу, создайте ее, запустите. У меня пока нет возможности использовать Flex до тех пор, пока я не разберу это решение и не добавлю его в yaml. Я работаю над этой облачной средой, поскольку я работаю над всеми примерами GO. Теперь я хочу поговорить с облаком sql и застревать. Теперь я думаю, что сражаюсь с облачной оболочкой google. Я развожу свое приложение и включу flex сегодня вечером и опубликую результаты. Строки подключения ниже не работают в облачной оболочке, но, по крайней мере, строка гибкого соединения дает мне новое сообщение ... нет такого каталога файлов. –

+0

. Вы должны сделать это более понятным в своем сообщении. В этом случае вы не должны ** следовать инструкциям App Engine, поскольку они предназначены для подключения из App Engine. Соединение с облачной оболочкой несколько сложнее, вам нужно будет загрузить и запустить Cloud SQL Proxy в оболочке, чтобы подключиться (используя ту же строку подключения, которую я отправил из App Engine Flex) – Vadim

ответ

7

Ниже перечислены правильные строки подключения, но они различаются в зависимости от того, с какой версией App Engine вы подключаетесь.

App Engine Standard:

user:[email protected](INSTANCE_CONNECTION_NAME)/dbname 

App Engine Гибкость:

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

Спасибо, Вадим, ваше руководство помогло и у меня есть строка соединения unix, работающая в среде 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

Для новых людей GO, App Engine и CloudSQL просто написать простейшую программу GO для подключения и общаться с вашей облачной базой данных CloudSQL разочаровывает!

У вас есть выбор, App Eng или App Eng Flex, SQL 1st или 2nd Gen .... В зависимости от комбинации соединения строки разные. Вся документация google при поиске приводит вас в первый ген SQL и App Engine без flex, потому что это то, что является преимущественно производством. Убедитесь, что вы читаете документацию Flex, если вы это делаете. Убедитесь, что вы читаете документы второго поколения, если вы это делаете. Иногда они представляют собой совершенно разные документы, иногда документация укладывается на страницу, и вы должны перейти к нижнему, чтобы узнать о новых материалах 2-го поколения sql и app eng flex.

CloudShell сложно, я до сих пор не могу скомпилировать GO и поговорить с SQL 2 здесь. Я успешно разговариваю с облачным sql 2-го поколения из развернутого Flex приложения с помощью 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") 
} 

} 
Смежные вопросы