【问题标题】:How to connect to mysql with go?如何使用 go 连接到 mysql?
【发布时间】:2013-03-19 20:57:31
【问题描述】:

我一直在尝试用 go 连接 mysql,但我似乎可以成功。我只是想从表中获取一个值并将其设置为变量并打印它。我缺少的可能只是一些明显的东西

这是来自名为 bankdata 的数据库

mysql> select * from accounts ;
+----+----------+-----------------+----------+---------+
| id | username | email           | facebook | twitter |
+----+----------+-----------------+----------+---------+
|  1 | user1    | email1@mail.com | userfb1  | NULL    |
|  2 | user2    | email2@mail.com | NULL     | NULL    |
|  3 | user3    | email3@mail.com | NULL     | NULL    |
+----+----------+-----------------+----------+---------+

我使用了两个驱动程序,我似乎可以理解它们的问题

使用go-sql-driver

package main

import (
    "database/sql"
    _ "github.com/Go-SQL-Driver/MySQL"
    "log"
)

const (
    DB_HOST = "tcp(127.0.0.1:3306)"
    DB_NAME = "bankdata"
    DB_USER = /*"root"*/ "bankadmin"
    DB_PASS = /*""*/ "1234"
)

func main() {
    dsn := DB_USER + ":" + DB_PASS + "@" + DB_HOST + "/" + DB_NAME + "?charset=utf8"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    var str string
    q := "select username from bankadmin.accounts where id = 1"
    err = db.QueryRow(q).Scan(&str)
    if err != nil {
        log.Fatal(err)
    }
    log.Println(str)
}

返回

D:\_>go run dbtest.go
2013/03/29 13:14:11 Error 1045: Access denied for user 'bankadmin'@'localhost'
(using password: YES)
exit status 1

密码实际上是正确的,对于用户 root 和 bankadmin,以及在端口 3306 中运行的 mysql。但是,如果我将 DB_HOST 更改为“tcp(127.0.0.1:3000)”或更改 127.0 .0.1 到 localhost,它给了我同样的错误。

使用mymysql driver

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/ziutek/mymysql/godrv"
    "log"
    "strconv"
)

const (
    DB_HOST = "tcp(127.0.0.1:3306)"
    DB_NAME = "bankdata"
    DB_USER = "bankadmin"
    DB_PASS = "1234"
)

type User struct {
    Id       int    
    Username string 
    Email    string 
    Facebook string
}

func OpenDB() *sql.DB {
    db, err := sql.Open("mymysql", fmt.Sprintf("%s/%s/%s", DB_NAME, DB_USER, DB_PASS))
    if err != nil {
        panic(err)
        log.Fatal(err)
    }
    return db
}

func UserById(id int) *User {
    db := OpenDB()
    defer db.Close()
    row := db.QueryRow("SELECT id, username, email FROM accounts WHERE id=?", id)
    user := new(User)
    row.Scan(&user.Id, &user.Username, &user.Email, &user.Facebook)
    return user
}

func main() {
    db := OpenDB()
    defer db.Close()
    row := db.QueryRow("SELECT id, username, email, facebook FROM accounts WHERE id=2")
    user := new(User)
    row.Scan(&user.Id, &user.Username, &user.Email, &user.Facebook)
    fmt.Println("id    : " + strconv.Itoa(user.Id) + "\nname  : " + user.Username + "\nemail : \n" + user.Email)

}

返回:

D:\_>go run dbtest.go
id    : 0
name  :
email :

看起来 id 和字符串都是空的,就像它从未从 row.Scan 函数接收到任何值一样。而且我不知道如何确保它们已连接,即使它们没有给我与以前的驱动程序相同的错误

哦,我使用的是 Windows 7,WAMP 附带的 MySQL 5.5.8。

如果我在这篇文章中犯了任何错误,请原谅我。这是我的第一篇文章。

【问题讨论】:

  • 确保您的用户是bankadmin,密码是1234
  • 这是写在mysql cmd上的内容mysql> drop database if exists bankdata;Query OK, 1 row affected (1.28 sec)mysql> create database bankdata;Query OK, 1 row affected (0.00 sec)mysql> grant all privileges on bankdata.* to 'bankadmin'@'localhost' identified by '1234';mysql> grant all privileges on bankdata.* to 'bankadmin'@'localhost' identified by '1234';Query OK, 0 rows affected (0.09 sec)Query OK, 0 rows affected (0.09 sec)mysql> flush privileges;@987654336>@98765438@s@pan>@98765438@s@pan
  • Go-MySQL-Driver 是最新的吗?可能是这个错误:github.com/go-sql-driver/mysql/issues/35 否则,就像 Baron Schwartz 说的:This is a really common problem with MySQL in general. There's probably a .01% chance this is a problem in the driver. See http://dev.mysql.com/doc/refman/5.1/en/access-denied.html and look especially at the portions that discuss what happens when you have default privileges in the privilege tables. In your case you probably have a mismatch between the hostname defined for the user in the privileges table, and the hostname used for authentication.
  • 请注意,包路径已更改为github.com/go-sql-driver/mysql(全部小写)

标签: mysql go


【解决方案1】:

问题不是你的 go 代码问题是你的 mysql 配置。您可能拥有正确的用户名和密码,但您可能没有授权该用户使用 tcp 连接到数据库。

【讨论】:

【解决方案2】:

正如@Jeremy wall 所提到的,问题出在连接字符串上。我使用的用户名是错误的。要配置设置, 1.转到“服务器”选项 2. 选择管理服务器连接 3.选择连接部分 4.点击密码部分的钥匙串中的存储按钮并输入新密码

你已经准备好了。现在尝试测试连接按钮。当我尝试从 GO 程序访问数据库时,它对我有用。

【讨论】:

    猜你喜欢
    • 2013-07-07
    • 2013-09-16
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2014-02-17
    • 2019-04-09
    • 2021-07-10
    • 2015-12-27
    相关资源
    最近更新 更多