kp

gormをWebアプリケーションに組み込む

gormを使ってみた

ちょっとgormを使ってみました。

Webアプリケーションを作りたいのでWeb周りはginを使ってみましたが、そっちはここでは関係ないです。

DBへのconnectionをどこで張ったらいいのかというのが少し悩んだんですが、深く考えずにmain()の中で作ってます。

package main

import (
    "fmt"
    "net/http"

    "github.com/gin-gonic/gin"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

var db *gorm.DB

type User struct {
    ID            uint
    Email         string
}

func getUser(c *gin.Context) {
    var user User
    db.First(&user, c.Param("id"))

    c.JSON(http.StatusOK, user)
}

func main() {
    var dbErr error

    db, dbErr = gorm.Open("mysql", "mysql:root@/test_development")
    if dbErr != nil {
        panic("failed to connect database")
    }

    r := gin.Default()
    r.GET("/users/:id", getUser)
    r.Run()
}

これでgo run main.goを実行。 そういえばgoではパッケージ名と同じ名前の.goファイルを作ってmain()を書くのがベストプラクティスらしいけど、今回はmain.goにしちゃいました。

コネクション数の確認

今回はMySQLにつなげたのでコネクション数の確認をしてみます。

mysql> show status like 'Threads_connected';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 5     |
+-------------------+-------+
1 row in set (0.00 sec)

ここでブラウザからlocalhost:8080/users/1を何回か叩いてみて現在の接続数を見てみます。

mysql> show status like 'Threads_connected';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 5     |
+-------------------+-------+
1 row in set (0.00 sec)

5で変わらず。

これで接続はいいのかな。

gormのOpenはその中でsqlのOpenを叩いていて、 Openのドキュメントには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.