インストール
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】 - 技術向上