レコードを作成する
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()} |
Create()
を使用して複数のレコードを作成することもできます:
users := []*User{ |
注記 ‘create’ の引数として構造体を渡すことはできません。データへのポインタを渡してください。
フィールドを選択してレコードを作成する
レコード作成時に、Selectで指定されたフィールドのみに対して値をアサインできます。
db.Select("Name", "Age", "CreatedAt").Create(&user) |
省略する項目を指定し、レコードを作成します。
db.Omit("Name", "Age", "CreatedAt").Create(&user) |
一括作成
大量のレコードを効率的に挿入するには、スライスを Create
メソッドに渡します。 GORMはすべてのデータを挿入する1つのSQL文を生成します。SQLが実行されると登録された主キーの値がモデルに代入され、フックメソッドも呼び出されます。 レコードを複数のバッチに分割することが可能な場合には、 トランザクション が開始されます。
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} |
CreateInBatches
を利用することで、バッチサイズを指定してレコードを作成することができます。
var users = []User{{Name: "jinzhu_1"}, ...., {Name: "jinzhu_10000"}} |
Upsert や Create With Associations を使用する場合もバッチインサートはサポートされています。
注記
CreateBatchSize
オプションを使ってGORMを初期化した場合、すべてのINSERT
は、その設定を参照してレコードやアソシエーションを作成します。
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{ |
作成時の Hooks
GORMでは、BeforeSave
, BeforeCreate
, AfterSave
, AfterCreate
としてユーザー定義の Hooks を実装することができます。 これらの Hooks メソッドはレコードの作成時に呼び出されます。ライフサイクルの詳細については Hooks を参照してください。
func (u *User) BeforeCreate(tx *gorm.DB) (err error) { |
Hooks
メソッドをスキップしたい場合は、SkipHooks
セッションモードを使用できます。例:
DB.Session(&gorm.Session{SkipHooks: true}).Create(&user) |
Map からの作成
GORMは map[string]interface{}
および []map[string]interface{}{}
からの作成に対応しています。
db.Model(&User{}).Create(map[string]interface{}{ |
注記 map から作成する場合、hooks は呼び出されません。また、アソシエーションは保存されず、主キーの値は埋め込まれません。
SQL式/Context Valuer からの作成
GORMではSQL式でデータの挿入が可能です。これを行うには map[string]interface{}
から作成する方法と データ型のカスタマイズ の2つの方法があります。例:
// Create from map |
高度な機能
関連データと関連付けて作成する
関連付けを使用してデータを作成する場合、関連付けの値がゼロ値ではない場合、これらの関連付けが作成および更新され、Hooks
メソッドが呼び出されます。
type CreditCard struct { |
Select
または Omit
を使用することで関連付けをスキップできます。例:
db.Omit("CreditCard").Create(&user) |
デフォルト値
default
タグでフィールドのデフォルト値を定義することができます。例:
type User struct { |
レコードがデータベースへ挿入されるとき、ゼロ値 のフィールドにはデフォルト値が 使用されます。
注意 デフォルト値を定義したフィールドでは、
0
、''
、false
といったゼロ値がデータベースに保存されません。これを回避するには、ポインタ型か Scanner/Valuer を使用します。例:
type User struct { |
注意 データベース内でデフォルト値や仮想的に生成される値を持つフィールドには、
default
タグを設定する必要があります。マイグレーション時にデフォルト値の定義をスキップする場合は、default:(-)
を使用します。例:
type User struct { |
注意 SQLite はバッチ挿入時のデフォルト値をサポートしていません。 参照: SQLite Insert stmt 例:
type Pet struct {
Name string `gorm:"default:cat"`
}
// In SQLite, this is not supported, so GORM will build a wrong SQL to raise error:
// INSERT INTO `pets` (`name`) VALUES ("dog"),(DEFAULT) RETURNING `name`
db.Create(&[]Pet{{Name: "dog"}, {}})フック内のフィールドにデフォルト値を割り当てることで代替できます。例:
func (p *Pet) BeforeCreate(tx *gorm.DB) (err error) {
if p.Name == "" {
p.Name = "cat"
}
}issues#6335 でより詳しい情報を確認できます。
仮想的に生成される値を使用する場合は、そのフィールドを作成/更新する権限を無効にする必要があります。フィールドレベル権限 を参照してください。
衝突時の挿入/更新
GORMは各データベースに対して互換性のあるUpsertをサポートしています。
import "gorm.io/gorm/clause" |
高度なクエリ の FirstOrInit
、FirstOrCreate
も確認してください。
詳細については Raw SQL and SQL Builder を参照してください。