こんにちは。
GORMはデベロッパーフレンドリーを目指した、Go言語のORMライブラリです。
goを使ってGORMを使ってデータベース操作する必要があると思います。
インストール
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
データベーススキーマの作成
スキーマの作成の仕方についてみていきます。
マイグレーション(Migrate)
Migrateは、接続先のスキーマを参照して、テーブルやカラムがなければ自動的に作ってくれるコマンドです。
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/
以上です。
ありがとうございます。