パンうめぇ

園児ニアの日記帳

goのdatabase/sqlの使い方備忘録

最近Goを触る機会があり,ちょっとハマりかけたdatabase/sql packageの使い方をメモ.

import

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

コネクションの確立

var db *sql.DB

func main() {
    err := godotenv.Load()
    if err != nil {
        log.Println("Error loading .env file")
    }
    db, err = sql.Open("mysql", "root:"+os.Getenv("DB_PASSWORD")+"@tcp(127.0.0.1:3306)/bbs") //接続
    if err != nil {
        log.Println(err)
    }
    err = db.Ping() //接続確認
    if err != nil {
        log.Println(err)
    }
    defer db.Close()

sql発行例

func LoginHandler(w http.ResponseWriter, r *http.Request) {
        email := "hoge@hoge.com"
        err := db.QueryRow("select email from users where email = ?", email).Scan(&email) //発行
        if err != sql.ErrNoRows { 
          http.Redirect(w, r, "/index", http.StatusFound)
       }

注意点

Openは基本的に一回だけ

ドキュメント以下

The returned DB is safe for concurrent use by multiple goroutines and maintains its own pool of idle connections. Thus, the Open function should be called just once. It is rarely necessary to close a DB.

golang.org

書いてあるように,コネクションプールのおかげでsql.Open()の呼び出しは一回だけでいいっぽい. 最初hundlerごとにopen,closeしてたw

mainまたはinitで接続を確立し,コネクションプールで使い回す感じだと学びました.

接続確認にはdb.Ping()を呼び出す.

ドキュメント以下にあるように,db.Open()は引数の検証をするだけであるため接続確認はdb.Ping()を使用する.

Open may just validate its arguments without creating a connection to the database. To verify that the data source name is valid, call Ping.

所感

まだGolangを触り始めたばかりですが,小さいパーツからつくっていくこの感じ面白いです.

はやくチュートリアル終わらせて本格的なプロダクトをつくってみたいです. まだまだ知識不足なのでもっと勉強します.