🐁

GoでORM(GORM)

2021/07/04に公開

ORMとは

  • Object Relational Mapping(オブジェクト関係マッピング)
  • オブジェクト指向プログラミング言語とRDBMSをいい感じに繋いでくれる技術
  • 取引の際には内部でSQLを生成する

メリット

  • SQLを書かなくていい
  • オブジェクトとして取得できるので扱いやすい

デメリット

  • SQLを書かなくていい
    • すでにSQLできる人にとっては必要ない
    • 意図しないSQLが生成される

GORMとは

https://github.com/go-gorm/gorm

  • GoでORMを扱いやすくするフレームワーク

実行サンプル(MySQL)

+---------------------+
| Tables_in_sample_db |
+---------------------+
| users               |
+---------------------+
+----+-------+
| id | name  |
+----+-------+
|  1 | Alex  |
|  2 | Bob   |
|  3 | Candy |
+----+-------+
package main

import (
  "fmt"

  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

type Users struct {
  Id   int `json:id`
  Name string `json:name`
}

func Connect() *gorm.DB {
  dsn := "root:pass@tcp(127.0.0.1:3306)/sample_db"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

  if err != nil {
    panic(err.Error())
  }

  return db
}

func main() {
  db := Connect()

  user := Users{}
  users := []Users{}
  
  // SELECT(単体)
  db.First(&user, "id=?", 1)
  fmt.Println(user)
  // > {1 Alex}

  // SELECT(複数)
  db.Find(&users, "id=?", 2)
  fmt.Println(users)
  // > [{2 Bob}]
}

その他

https://github.com/go-sql-driver/mysql
以前まではGo-MySQL-Driverを使ってを操作していたけど、GORMの方がより直感的に、Goの書き方で扱えるイメージ。
チーム開発の場ではより良いかもしれない。

Discussion