1.  简单创建记录

	user := User{Name: "李四", Age: 88, Birthday: time.Now()}
ret := db.Create(&user) // 通过数据的指针来创建
fmt.Println(user.ID) // 返回插入数据的主键
fmt.Println(ret.Error) // 返回错误
fmt.Println(ret.RowsAffected) // 插入数据的条数

  

2.  用指定的字段创建记录

user := User{Name: "李四3", Age: 19}
db.Debug().Select("name", "age").Create(&user)

  

3. 排除指定的字段创建记录

	user := User{Birthday: time.Now(), Name: "李四", Age: 10}
db.Debug().Omit("name", "age").Create(&user)

  

4.  批量插入

	// 批量插入1
var users = []User{{Name: "04"}, {Name: "05"}, {Name: "06"}}
db.Create(&users) // 批量插入2: 使用 CreateInBatches 分批创建时,你可以指定每批的数量
var users = []User{{Name: "07"}, {Name: "08"}, {Name: "09"}}
db.CreateInBatches(users, 2)

  

5.  创建钩子,插入前的钩子 BeforeCreate

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
u.UUID = uuid.NewV4() if u.Role == "admin" {
fmt.Println("执行失败了")
return errors.New("invalid role")
}
return
}

  如果您想跳过 钩子 方法,您可以使用 SkipHooks 会话模式

	db.Session(&gorm.Session{SkipHooks: true}).Create(&user)

  

6.  根据Map创建

db.Model(&User{}).Create(map[string]interface{}{
"Name": "jinzhu", "Age": 18,
}) db.Model(&User{}).Create([]map[string]interface{}{
{"Name": "jinzhu_1", "Age": 18},
{"Name": "jinzhu_2", "Age": 20},
})

  注意:根据map创建记录的时候,不会走钩子方法

7.  关联创建

  创建关联数据时,如果关联值是非零值,这些关联会被upsert,且它们的hook方法也会被调用

type BaseModel struct {
Age uint8
Address string
UserID uint
}
func (b *BaseModel) BeforeCreate(tx *gorm.DB) (err error) {
fmt.Println("BaseModel 的 BeforeCreate执行了")
return
}
type User struct {
ID uint `gorm:"primaryKey;autoincrement"`
BaseModel BaseModel
Name string
UUID uuid.UUID
Role string
} func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
u.UUID = uuid.NewV4() if u.Role == "admin" {
fmt.Println("执行失败了")
return errors.New("invalid role")
}
return
}

// 关联创建
db.Create(&User{
Name: "马亚南",
BaseModel: BaseModel{Age: 29, Address: "河北"},
})

  INSERT INTO `base_models` (`age`,`address`,`user_id`) VALUES (9,'保定',2) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)

  INSERT INTO `users` (`name`,`uuid`,`role`) VALUES ('哈哈','a060b60a-1e1c-45b5-a23a-109d04694cba','')

您也可以通过 Select、 Omit 跳过关联保存,例如:

	db.Omit("BaseModel").Create(&User{
Name: "嘿嘿",
Role: "admin2",
BaseModel: BaseModel{Age: 19, Address: "保定2"},
})

  跳过所有关联

db.Omit(clause.Associations).Create(&user)

  

8.  默认值

  插入记录到数据库时,默认值会被用于填充值为零值的字段。

注意 像 0''false 等零值,不会将这些字段定义的默认值保存到数据库。您需要使用指针类型或 Scanner/Valuer 来避免这个问题,例如:

type User struct {
ID int `gorm:"primaryKey;autoIncrement"`
Name sql.NullString `gorm:"default:'隔壁老王'"`
Age *uint8 `gorm:"default:55"`
} // 带默认值的插入零值
db.Create(&User{Name: sql.NullString{"", true}, Age: new(uint8)})

  

9.  Upsert 及冲突

  在插入冲突时,什么都不做

	ret := db.Clauses(clause.OnConflict{DoNothing: true}).Create(&User{ID: 4, Name: sql.NullString{"你好啊", true}})
fmt.Println(ret.RowsAffected)

  

gorm创建记录的更多相关文章

  1. gorm创建记录及设置字段默认值

    package main import ( "database/sql" "gorm.io/driver/mysql" "gorm.io/gorm&q ...

  2. Dynamics CRM2016 Web API之创建记录

    前篇介绍了通过primary key来查询记录,那query的知识点里面还有很多需要学习的,这个有待后面挖掘,本篇来简单介绍下用web api的创建记录. 直接上代码,这里的entity的属性我列了几 ...

  3. gorm操练记录

    这个数据库的定义蛮全的,先作个记录. package main import ( "time" "github.com/jinzhu/gorm" _ " ...

  4. mysql insert一条记录后怎样返回创建记录的主键id,last_insert_id(),selectkey

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  5. mysql insert一条记录后 返回创建记录主键id的方法

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  6. gorm 更新数据时,0值会被忽略

    原文: https://www.tizi365.com/archives/22.html ------------------------------------------------------- ...

  7. GORM入门指南

    gorm是一个使用Go语言编写的ORM框架.它文档齐全,对开发者友好,支持主流数据库. gorm介绍 Github GORM 中文官方网站内含十分齐全的中文文档,有了它你甚至不需要再继续向下阅读本文. ...

  8. GORM CRUD指南

    CRUD通常指数据库的增删改查操作,本文详细介绍了如何使用GORM实现创建.查询.更新和删除操作. CRUD CRUD通常指数据库的增删改查操作,本文详细介绍了如何使用GORM实现创建.查询.更新和删 ...

  9. GORM学习指南

    orm是一个使用Go语言编写的ORM框架.它文档齐全,对开发者友好,支持主流数据库. 一.初识Gorm Github GORM 中文官方网站内含十分齐全的中文文档,有了它你甚至不需要再继续向下阅读本文 ...

随机推荐

  1. maven打包 运行出现 错误: 找不到或无法加载主类 jar

    使用maven进行打包成jar包后 使用java -jar运行jar包 出现 错误: 找不到或无法加载主类 jar 主要是由于依赖没下载好,重新下载依赖 以及要在项目的pom.xml里面添加 < ...

  2. c++设计模式概述之中介

    代码写的不够规范,目的是为了缩短篇幅,实际中请不要这样做. 1.概述 A.中介模式,主要对象有两类: 中介和用户,类比生活中的房产中介公司,中介手中掌握着用户的资料,当然,用户手中也有中介的联系方式. ...

  3. 【LeetCode】88. Merge Sorted Array 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 新建数组 日期 题目地址:https://leetc ...

  4. 【LeetCode】859. Buddy Strings 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 日期 题目地址:https://leetcod ...

  5. EXCEL技能 | EXCEL中实现地图快照,截大图、加水印、保存PNG、TIF、HTML文件

    1 应用场景 本文分享笔者使用EXCEL制作地图的体验. 之前网上有人介绍使用小O地图EXCEL插件版能够在EXCEL中标注地图.绘制地图.可视化数据等操作.如下截图.笔者通过实验,其软件保存方式只能 ...

  6. 51Nod 1279:扔盘子(二分||单调栈)

    1279 扔盘子 1.0 秒 131,072.0 KB 5 分 1级题 有一口井,井的高度为N,每隔1个单位它的宽度有变化.现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住( ...

  7. BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition

    BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition 目录 BBN: Bi ...

  8. STM32零基础入门教程

    本文主要是针对想了解STM32,手里又没有太多预算的小伙伴.市场上针对新手来说,比较合适的STM32开发版太贵,比如正点原子.树莓派等,便宜的教程又不详细,这对想白嫖的小伙伴来说不太有好,所以我选了一 ...

  9. SpringCloud集成Security安全(Eureka注册中心)

    1.说明 为了保护注册中心的服务安全, 避免恶意服务注册到Eureka, 需要对Eureka Server进行安全保护, 本文基于Spring Security方案, 为Eureka Server增加 ...

  10. 包含全国所有省份、城市、县的一份json文件

    最近做项目时,有个需要全国所有省市信息的数据,于是百度了一下,发现CSDN的很多都需要积分下载,无解!所以自己收集了一份整理了出来. 简单说明一下 1.这是一份json文件,这是因为全国的省市信息一般 ...