Создание записи
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()} |
Мы также можем создать несколько записей с помощью Create()
:
users := []*User{ |
NOTE You cannot pass a struct to ‘create’, so you should pass a pointer to the data.
Создание записи с указанными полями
Create a record and assign a value to the fields specified.
db.Select("Name", "Age", "CreatedAt").Create(&user) |
Create a record and ignore the values for fields passed to omit.
db.Omit("Name", "Age", "CreatedAt").Create(&user) |
Пакетная вставка
To efficiently insert large number of records, pass a slice to the Create
method. GORM will generate a single SQL statement to insert all the data and backfill primary key values, hook methods will be invoked too. It will begin a transaction when records can be split into multiple batches.
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} |
You can specify batch size when creating with CreateInBatches
, e.g:
var users = []User{{Name: "jinzhu_1"}, ...., {Name: "jinzhu_10000"}} |
Batch Insert is also supported when using Upsert and Create With Associations
NOTE initialize GORM with
CreateBatchSize
option, allINSERT
will respect this option when creating record & associations
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{ |
Создание хуков
GORM allows user defined hooks to be implemented for BeforeSave
, BeforeCreate
, AfterSave
, AfterCreate
. These hook method will be called when creating a record, refer Hooks for details on the lifecycle
func (u *User) BeforeCreate(tx *gorm.DB) (err error) { |
If you want to skip Hooks
methods, you can use the SkipHooks
session mode, for example:
DB.Session(&gorm.Session{SkipHooks: true}).Create(&user) |
Create с помощью Map(карты)
GORM supports create from map[string]interface{}
and []map[string]interface{}{}
, e.g:
db.Model(&User{}).Create(map[string]interface{}{ |
NOTE When creating from map, hooks won’t be invoked, associations won’t be saved and primary key values won’t be back filled
Метод Create с помощью SQL выражения/значения контекста
GORM allows insert data with SQL expression, there are two ways to achieve this goal, create from map[string]interface{}
or Customized Data Types, for example:
// Создать из map |
Дополнительно
Create со связями
When creating some data with associations, if its associations value is not zero-value, those associations will be upserted, and its Hooks
methods will be invoked.
type CreditCard struct { |
You can skip saving associations with Select
, Omit
, for example:
db.Omit("CreditCard").Create(&user) |
Значения по умолчанию
You can define default values for fields with tag default
, for example:
type User struct { |
Then the default value will be used when inserting into the database for zero-value fields
NOTE Any zero value like
0
,''
,false
won’t be saved into the database for those fields defined default value, you might want to use pointer type or Scanner/Valuer to avoid this, for example:
type User struct { |
NOTE You have to setup the
default
tag for fields having default or virtual/generated value in database, if you want to skip a default value definition when migrating, you could usedefault:(-)
, for example:
type User struct { |
NOTE SQLite doesn’t support some records are default values when batch insert. See SQLite Insert stmt. For example:
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"}, {}})A viable alternative is to assign default value to fields in the hook, e.g.
func (p *Pet) BeforeCreate(tx *gorm.DB) (err error) {
if p.Name == "" {
p.Name = "cat"
}
}You can see more info in issues#6335
When using virtual/generated value, you might need to disable its creating/updating permission, check out Field-Level Permission
Upsert (Создать или обновить) / При конфликте
GORM provides compatible Upsert support for different databases
import "gorm.io/gorm/clause" |
Also checkout FirstOrInit
, FirstOrCreate
on Advanced Query
Checkout Raw SQL and SQL Builder for more details