gorm创建记录
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创建记录的更多相关文章
- gorm创建记录及设置字段默认值
package main import ( "database/sql" "gorm.io/driver/mysql" "gorm.io/gorm&q ...
- Dynamics CRM2016 Web API之创建记录
前篇介绍了通过primary key来查询记录,那query的知识点里面还有很多需要学习的,这个有待后面挖掘,本篇来简单介绍下用web api的创建记录. 直接上代码,这里的entity的属性我列了几 ...
- gorm操练记录
这个数据库的定义蛮全的,先作个记录. package main import ( "time" "github.com/jinzhu/gorm" _ " ...
- mysql insert一条记录后怎样返回创建记录的主键id,last_insert_id(),selectkey
mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...
- mysql insert一条记录后 返回创建记录主键id的方法
mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...
- gorm 更新数据时,0值会被忽略
原文: https://www.tizi365.com/archives/22.html ------------------------------------------------------- ...
- GORM入门指南
gorm是一个使用Go语言编写的ORM框架.它文档齐全,对开发者友好,支持主流数据库. gorm介绍 Github GORM 中文官方网站内含十分齐全的中文文档,有了它你甚至不需要再继续向下阅读本文. ...
- GORM CRUD指南
CRUD通常指数据库的增删改查操作,本文详细介绍了如何使用GORM实现创建.查询.更新和删除操作. CRUD CRUD通常指数据库的增删改查操作,本文详细介绍了如何使用GORM实现创建.查询.更新和删 ...
- GORM学习指南
orm是一个使用Go语言编写的ORM框架.它文档齐全,对开发者友好,支持主流数据库. 一.初识Gorm Github GORM 中文官方网站内含十分齐全的中文文档,有了它你甚至不需要再继续向下阅读本文 ...
随机推荐
- 【LeetCode】215. Kth Largest Element in an Array 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:移除最大值 方法二:排序 方法三:大顶堆 方 ...
- 【LeetCode】166. Fraction to Recurring Decimal 解题报告(Python)
[LeetCode]166. Fraction to Recurring Decimal 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingz ...
- 【LeetCode】877. Stone Game 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学 双函数 单函数 + 记忆化递归 动态规划 日期 ...
- 【LeetCode】888. Fair Candy Swap 公平的糖果棒交换(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人公众号: 每日算法题 本文关键词:力扣,LeetCode,算法题,算法,Python 目录 题目描述 题目大意 解题方法 代码 刷题心得 关于作 ...
- 【剑指Offer】连续子数组的最大和 解题报告(Python)
[剑指Offer]连续子数组的最大和 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- Network (poj1144)
A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting se ...
- Essentially No Barriers in Neural Network Energy Landscape
目录 梗概 主要内容 path的定义 path的逼近 Mechanical Model Nudged Elastic Band 局部最优 Draxler F, Veschgini K, Salmhof ...
- [数据结构]链表LinkList
目录 1.3 链表 1.3.1 头插法建立单链表 1.3.2 限制链表长度建立单链表 1.3.3 尾插法建立单链表 1.3.4 按序号查找单链表 1.3.5 按值查找单链表 1.3.6 链表的插入 1 ...
- <学习opencv>图像和大型阵列类型
OPenCV /*=========================================================================*/ // 图像和大型阵列类型 /* ...
- HTML网页设计基础笔记 • 【第5章 常用的样式属性】
全部章节 >>>> 本章目录 5.1 字体及文本属性 5.1.1 字体属性 5.1.2 文本属性 5.2 边距和填充 5.2.1 边距 5.2.2 填充 5.3 边框属性 ...