2016-03-08 117 views
1

我正在讓Golang API能夠與我的Android應用程序中的SQL數據庫進行交互。我的問題是:遠程訪問Golang的OVH SQL數據庫API

我有一個SQL數據庫託管在https://phpmyadmin.ovh.net/

我想我的語言環境API連接到這一個。根據文檔:

func Open(driverName, dataSourceName string) (*DB, error) 

driverName params會是「mysql」不是嗎? 但是,什麼是dataSourceName PARAMS?

我看到很多關於Open的帖子,但是,我不認爲我理解如何組織關於dataSourceName params的url字符串。

package main 

import (
    "net/http" 
    "database/sql" 
    "fmt" 
) 

var db *sql.DB // global variable to share it between main and the HTTP handler 

func main() { 

fmt.Println("starting up") 

db, err := sql.Open("mysql", "????????????") 
if err != nil { 
    fmt.Println("Error on initializing database connection: %s", err.Error()) 
} 

err = db.Ping() 
if err != nil { 
    fmt.Println("Error on opening database connection: %s", err.Error()) 
} 

http.HandleFunc("/", hello) 
http.ListenAndServe(":8080", nil) 
} 

感謝您的閱讀&幫助!

/\編輯/ \

所以,你的兩個答案後,我嘗試下面的代碼:!

package main 

import (
"fmt" 
"net/http" 
"database/sql" 
_ "github.com/go-sql-driver/mysql" 
) 

type databaseinfos struct { 
user string 
password string 
name string 
address string 
port string 
url string 
} 

var db *sql.DB // global variable to share it between main and the HTTP handler 
var dbi *databaseinfos 

func main() { 

dbi := databaseinfos{ 
    user: "Emixam23", 
    password: "", 
    name: "mydb", 
    address: "127.0.0.1", 
    port: "3306", 
    url: ""} 
dbi.url = (dbi.user + ":" + dbi.password + "@tcp(" + dbi.address + ":" + dbi.port + ")/" + dbi.name) 

fmt.Println(dbi.url) 

db, err := sql.Open("mysql", dbi.url) 
if err != nil { 
    fmt.Println("Error on initializing database connection: %s", err.Error()) 
} 

err = db.Ping() 
if err != nil { 
    fmt.Println("Error on opening database connection: %s", err.Error()) 
} 

/*http.HandleFunc("/", hello)*/ 
http.ListenAndServe(":8080", nil) 
} 

但是,我得到了一個錯誤,這是「打開數據庫上的錯誤連接:%s dial tcp 127.0.0.1:3306:connectex:由於目標機器主動拒絕它,所以不能建立連接。「

問題出在是因爲我的電腦還是因爲dataSourceName params?

+0

您還需要導入MySQL驅動程序:https://github.com/go-sql-driver/mysql – elithrar

+0

感謝您的回答 –

+0

您收到錯誤消息('無法建立連接'),因爲您的服務器上的MySQL實例不接受連接。檢查它是否正在運行,看看你是否可以使用同一臺機器上的命令行工具進行連接:mysql -u -p -h ' –

回答

1

了dataSourceName應該在DSN格式提供:

<username>:<password>@tcp(<host>:<port>)/<database> 

例如:

db, err := sql.Open("mysql", "myuser:[email protected](127.0.0.1:3306)/mydb") 
+0

謝謝你的回答 –

0

有一個在你的代碼中的問題,在這裏:

dbi.url = (dbi.user + ":" + dbi.password + "@tcp(... 

這樣用我看到的參數來構建連接字符串e會導致:

Emixam23:@tcp..

密碼爲空,如果我們看一下測試,這是錯誤的:

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN] 

我們看到,如果不需要密碼,您一定不要添加「:」

如果問題仍然存在和連接字符串確實匹配正確的模式,測試您可以訪問DB:

mysql -u Emixam23 

或密碼:

mysql -u Emixam23 -p 

然後嘗試訪問數據庫,看看你的用戶具有適當的pemissions:

​​

如果你甚至不能連接:

檢查您的端口和IP綁定是正確的:

sudo netstat -antp | grep mysql 

如果不是,請相應地編輯/etc/mysql/my.cnf

+0

好的,謝謝你的回答。但是,如果我想在本地測試,如何在win10下創建本地數據庫? –

+0

啊,我想你已經在本地運行,那麼我猜連接字符串的密碼不是問題,除非你的遠程數據庫沒有密碼,這將是不安全的。我從來沒有使用Windows工作(我發現它是可怕的TBH),所以我不能幫你在那裏抱歉。 – Maresh