LoginSignup
0
0

Gormの使い方について

Posted at

こんにちは。

GORMはデベロッパーフレンドリーを目指した、Go言語のORMライブラリです。
goを使ってGORMを使ってデータベース操作する必要があると思います。

インストール

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

データベーススキーマの作成

スキーマの作成の仕方についてみていきます。

マイグレーション(Migrate)

Migrateは、接続先のスキーマを参照して、テーブルやカラムがなければ自動的に作ってくれるコマンドです。

Screenshot 2023-07-17 at 6.23.52 PM.png

db.AutoMigrate(&User{})

db.AutoMigrate(&User{}, &Product{}, &Order{})

// Add table suffix when creating tables
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})

関連の貼り方

type CreditCard struct {
	gorm.Model
	Number string
	UserID uint
}

type User struct {
	gorm.Model
	Name        string
	CreditCards []CreditCard
}

Migrateコマンドは、一度に複数テーブル作成することもできるし、複数回呼び出すこともできるし。複数呼び出す場合、そのテーブル間で関連がある場合でも関連が作成されないので注意したい。以下に具体例を示します。

	db.AutoMigrate(&CreditCard{})
	db.AutoMigrate(&User{})

これだと関連が作られる

	db.AutoMigrate(&CreditCard{}, &User{})

データの登録方法

データの登録

以下のような形でMapを直接指定して登録することが可能です。

db.Model(&Product{}).Create(map[string]interface{}{
	"Code": "jinzhu", "Price": 18,
})

存在しない項目が指定された場合は以下のようなエラーが出力されて登録できないです。

2023/07/11 18:02:12 main.go:70 Error 1054: Unknown column 'Codec' in 'field list’

データの検索方法

最後に登録したデータの検索の仕方を見ていきます。

データの取得

データの取得は、処理実行の戻り値に返ってくるのではなく、まず変数を作って処理を実行するとそのアドレスにDBからの値が設定されるという仕組みです。

db.Where(&User{Name: "jinzhu", Age: 0}).Find(&users)
// SELECT * FROM users WHERE name = "jinzhu";

mapで検索

db.Where(map[string]interface{}{"Name": "jinzhu", "Age": 0}).Find(&users)
// SELECT * FROM users WHERE name = "jinzhu" AND age = 0;

こんな感じで変数に一旦入れて登録もできる

user := User{
  Name:            "pointpoint",
  BillingAddress:  Address{Address1: "Billing Address - Address 1"},
  ShippingAddress: Address{Address1: "Shipping Address - Address 1"},
  Emails:          []Email{
    {Email: "pointpoint@example.com"},
    {Email: "pointpoint1@example.com"},
  },
  Languages:       []Language{
    {Name: "JP"},
    {Name: "EN"},
  },
}

db.Create(&user)

RawSqlで取得

複雑なデータを取ってくる場合だと、どうしてもやっぱりスケール直接つなげて取得をするしかないケースもある。そういった時にどうやって取得をするかと言う0をいかに上げる。

type Result struct {
	ID   int
	Name string
	Age  int
}
// raw SQLで検索
var results []Result
db.Raw("SELECT id, name, age FROM users WHERE age > ?", 20).Scan(&results)
for index, result := range results {
   	fmt.Println("テスト", index, result.ID, result.Name)
}

以下の様に、mapを使って変数を渡すこともできる

db.Raw("SELECT * FROM users WHERE (name = @name AND age > @age)",
		map[string]interface{}{"name": "test", "age": 11}).Find(&results)

データの削除

Gormでは削除はSoftDeleteが基本となっている様で、以下の様に削除するとdeletedAtに削除した時刻が入ります。
削除フラグだと、データを消して再度同じデータを登録しようとしたときにキー重複エラーを起こしてしまいがちだけど、この方法ならそれも避けられると思います。

lang1 := Language{
	Code: "FN",
	Name: "フランス"}
DB.Create(&lang1)
fmt.Println("Language削除します")
DB.Delete(&lang1)

Gorm使ったデータの登録変更削除のやり方を見てきました。

参考情報:
https://gorm.io/ja_JP/docs/

以上です。
ありがとうございます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0