5

mysql を go に接続しようとしていますが、成功しているようです。テーブルから値を取得し、変数に設定して印刷しようとしています。私が見逃しているのは、おそらく明らかなことです

これは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    |
+----+----------+-----------------+----------+---------+

私が使用した2つのドライバーがあり、両方の何が問題なのか理解できるようです

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 のパスワードは実際には正しいです。 localhost、それは私に同じエラーを与えました。

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 :

row.Scan 関数から値を受け取っていないように、id と文字列の両方が空のようです。そして、以前のドライバーと同じエラーが発生しなかったにもかかわらず、それらが接続されていることを確認する方法がわかりません

ああ、私は Windows 7、WAMP に付属の MySQL 5.5.8 を使用しています。

この投稿に誤りがありましたら、ご容赦ください。これは私の最初の投稿です。

4

2 に答える 2

2

問題はgoコードではなく、mysql構成です。正しいユーザー名とパスワードを持っている可能性がありますが、そのユーザーが tcp を使用してデータベースに接続することを許可していない可能性があります。

于 2013-03-31T20:11:40.400 に答える
1

ここに画像の説明を入力

@Jeremy wall が述べたように、問題は接続文字列にありました。使用したユーザー名が間違っています。設定を構成するには、 1. [サーバー] オプションに移動します 2. [サーバー接続の管理] を選択します 3. [接続] セクションを選択します 4. [パスワード] セクションの [キーチェーンに保存] ボタンをクリックし、新しいパスワードを入力します

準備万端です。テスト接続ボタンを試してください。GOプログラムからdbにアクセスしようとしたときにうまくいきました。

于 2016-01-04T21:59:00.287 に答える