2016-03-08 118 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