我正在制作一个 Golang API,以便能够与我的 Android 应用程序中的 SQL 数据库进行交互。我遇到的问题如下:我在https://phpmyadmin.ovh.net/ 上托管了一个 sql 数据库我正在尝试将我的语言环境 API 连接到这个 API。根据文档:func Open(driverName, dataSourceName string) (*DB, error)driverName 参数将是“mysql”,不是吗?但是,dataSourceName参数是什么?我看到很多关于 Open 的帖子,但是,我认为我不明白如何组织有关 dataSourceName 参数的 url 字符串。package mainimport ( "net/http" "database/sql" "fmt")var db *sql.DB // global variable to share it between main and the HTTP handlerfunc 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 mainimport ("fmt""net/http""database/sql"_ "github.com/go-sql-driver/mysql")type databaseinfos struct {user stringpassword stringname stringaddress stringport stringurl string}var db *sql.DB // global variable to share it between main and the HTTP handlervar dbi *databaseinfosfunc 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参数?
2 回答

智慧大石
TA贡献1946条经验 获得超3个赞
dataSourceName应以 DSN 格式提供:
<username>:<password>@tcp(<host>:<port>)/<database>
例如:
db, err := sql.Open("mysql", "myuser:password@tcp(127.0.0.1:3306)/mydb")

桃花长相依
TA贡献1860条经验 获得超8个赞
你的代码有问题,在这里:
dbi.url = (dbi.user + ":" + dbi.password + "@tcp(...
这种使用我上面看到的参数构建连接字符串的方法将导致:
Emixam23:@tcp..
.
使用空密码,如果我们查看规范,这是错误的:
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]
我们看到,如果不需要密码,则不得添加“:”
如果问题仍然存在并且连接字符串实际上与正确的模式匹配,请测试您是否可以访问您的数据库:
mysql -u Emixam23
或密码:
mysql -u Emixam23 -p
然后尝试访问数据库以查看您的用户是否具有适当的权限:
> USE mydb; SELECT 1;
如果您甚至无法连接:
检查您的端口和 IP 绑定是否正确:
sudo netstat -antp | grep mysql
如果没有,请/etc/mysql/my.cnf
相应地编辑您的。
- 2 回答
- 0 关注
- 175 浏览
添加回答
举报
0/150
提交
取消