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】 - 技術向上