簡體   English   中英

如何用go連接到mysql?

[英]How to connect to mysql with go?

我一直在嘗試用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都適用,並且mysql在端口3306中運行。但是再說一次,如果我將DB_HOST更改為“ tcp(127.0.0.1:3000)”或將127.0.0.1更改為本地主機,它給了我同樣的錯誤。

使用mymysql驅動程序

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。

如果我在這篇文章中有任何錯誤,請原諒我。 這是我的第一篇文章。

問題不是您的go代碼,而是您的mysql配置。 您可能具有正確的用戶名和密碼,但是您可能尚未授權該用戶使用tcp連接到數據庫。

在此處輸入圖片說明

正如@Jeremy wall所提到的,問題出在連接字符串上。 我使用的用戶名錯誤。 要配置設置,1.轉到“服務器”選項2.選擇“管理服務器連接” 3.選擇“連接”部分4.單擊“密碼”部分中的“存儲在鑰匙串中”按鈕並輸入新密碼

你們都准備好了。 現在嘗試測試連接按鈕。 當我嘗試從GO程序訪問數據庫時,它為我工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM