レコードの作成
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()} |
Create()
を使用して複数のレコードを作成することもできます。
users := []*User{ |
注意 ‘create’ に構造体を渡すことはできません。そのため、データのポインタを渡す必要があります。
選択されたフィールドでレコードを作成
レコードを作成し、指定されたフィールドに値を割り当てます。
db.Select("Name", "Age", "CreatedAt").Create(&user) |
レコードを作成し、omit に渡されたフィールドの値を無視します。
db.Omit("Name", "Age", "CreatedAt").Create(&user) |
バッチ挿入
大量のレコードを効率的に挿入するには、Create
メソッドにスライスを渡します。GORM はすべてのデータを挿入する単一の SQL ステートメントを生成し、主キーの値をバックフィルし、フックメソッドも呼び出されます。レコードを複数のバッチに分割できる場合、トランザクションを開始します。
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} |
CreateInBatches
で作成する際にバッチサイズを指定できます。例:
var users = []User{{Name: "jinzhu_1"}, ...., {Name: "jinzhu_10000"}} |
バッチ挿入は、Upsert および 関連付けを伴う作成 を使用する場合にもサポートされています。
注意 GORM を
CreateBatchSize
オプションで初期化すると、レコードと関連付けを作成する際に、すべてのINSERT
がこのオプションを尊重します。
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{ |
作成フック
GORM では、BeforeSave
、BeforeCreate
、AfterSave
、AfterCreate
に対してユーザー定義のフックを実装できます。これらのフックメソッドは、レコードの作成時に呼び出されます。ライフサイクルの詳細については、フック を参照してください。
func (u *User) BeforeCreate(tx *gorm.DB) (err error) { |
Hooks
メソッドをスキップする場合は、SkipHooks
セッションモードを使用できます。例:
DB.Session(&gorm.Session{SkipHooks: true}).Create(&user) |
マップからの作成
GORM は、map[string]interface{}
および []map[string]interface{}{}
からの作成をサポートしています。例:
db.Model(&User{}).Create(map[string]interface{}{ |
注意 マップから作成する場合、フックは呼び出されず、関連付けは保存されず、主キーの値はバックフィルされません。
SQL 式/コンテキスト Valuer からの作成
GORM では、SQL 式を使用してデータを挿入できます。この目標を達成するには、map[string]interface{}
または カスタマイズされたデータ型 から作成する 2 つの方法があります。例:
// Create from map |
高度な設定
関連付けを伴う作成
関連付けを伴うデータを作成する場合、関連付けの値がゼロ値でない場合、それらの関連付けは Upsert され、その Hooks
メソッドが呼び出されます。
type CreditCard struct { |
Select
、Omit
を使用して関連付けの保存をスキップできます。例:
db.Omit("CreditCard").Create(&user) |
デフォルト値
default
タグを使用してフィールドのデフォルト値を定義できます。例:
type User struct { |
次に、ゼロ値フィールドに対してデータベースに挿入する際に、デフォルト値が使用されます。
注意
0
、''
、false
などのゼロ値は、デフォルト値が定義されたフィールドの場合、データベースに保存されません。これを回避するには、ポインタ型または Scanner/Valuer を使用する必要があります。例:
type User struct { |
注意 マイグレーション時にデフォルト値の定義をスキップする場合は、
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 を参照してください。
仮想/生成された値を使用する場合は、作成/更新権限を無効にする必要がある場合があります。フィールドレベルの権限 を確認してください。
Upsert / On Conflict
GORM は、さまざまなデータベースに対応した Upsert サポートを提供します。
import "gorm.io/gorm/clause" |
また、高度なクエリ で FirstOrInit
、FirstOrCreate
も確認してください。
詳細については、Raw SQL および SQL Builder を確認してください。