技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

MySQL【Go】

インストール

sql-Driverごとにpackageをインストールする必要があります。

$ go get -u github.com/go-sql-driver/mysql


import

database/sqlは、コード中で使用するものの、mysqlについてはプログラムの起動処理には使われますが、コード中では使用しないため、 アンダースコアによるエイリアスの切り捨てを行う必要があります。
これをしないと、mysqlがimportから自動削除されてしまいます(恐らくエディタに自動書き込み機能をインストールした場合のみ)。

import (
    ...
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)


接続

config.iniファイルを作成して、dbに関する情報を書き込み、
goファイルからその情報を読み込むことにします。


config.ini

[db]
name = user-name:password@/database-name    // MySQLインストール直後、usernameは"root"になっている。password未設定の場合は省略
driver = mysql


main.go

import (
    "database/sql"
    ...
    "github.com/go-ini/ini"    // dbに関する情報はiniファイルに外出しする
    _ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

type ConfigList struct {
    DBName, SQLDriver string
}

var Config ConfigList    // config.iniから読み取って、この構造体に格納する

func init() {
    cfg, err := ini.Load("config.ini")
    check(err)
    Config = ConfigList{
        DBName:    cfg.Section("db").Key("name").String(),
        SQLDriver: cfg.Section("db").Key("driver").String(),
    }
}

func main() {

    db, err := sql.Open("mysql", "root:afano11@/database-A")    // DBのポインタとerr(接続前の引数の書式チェック)を返す
    check(err)
    defer db.Close()    // 最後に必ず閉じる

    err = db.Ping()    // 接続状態を確認。接続に失敗していれば、エラーになる
    check(err)

    http.HandleFunc("/", index)
    http.Handle("/favicon.ico", http.NotFoundHandler())
    http.ListenAndServe(":8080", nil)
}

func index(w http.ResponseWriter, req *http.Request) {
    _, err := io.WriteString(w, "Completely Done.")
    check(err)
}

func check(err error) {
    if err != nil {
        fmt.Println(err)
    }
}


sql.Open()が返すエラーでは、database-nameやpasswordが間違っていても検出されないことに注意が必要です。
接続した時点でエラーかどうか判別するには、(*DB)Ping()を使用します。
sql.Open()が返すDBのポインタは、複数のgoroutineによる同時実行にも対応します。よって、1つのデータベースに対するsql.Openは常に1度だけで大丈夫です。Close()も忘れてはいけません。

SQL操作

過去に記載したsqlite3と同じです。
sqlite3【Go】 - 技術向上