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 中文官方网站内含十分齐全的中文文档,有了它你甚至不需要再继续向下阅读本文 ...
随机推荐
- JAVA获得websocket请求路径前缀
/** * 获得websocket请求路径前缀(线程安全 速度相对慢) * @param request * @return */ public static String getWebsocketU ...
- 【LeetCode】1047. Remove All Adjacent Duplicates In String 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 日期 题目地址:https://leetcode ...
- 【LeetCode】881. Boats to Save People 解题报告(Python)
[LeetCode]881. Boats to Save People 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu ...
- 【LeetCode】166. Fraction to Recurring Decimal 解题报告(Python)
[LeetCode]166. Fraction to Recurring Decimal 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingz ...
- 【LeetCode】677. Map Sum Pairs 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 前缀树 日期 题目地址:https://lee ...
- A1. 道路修建 Small(BNUOJ)
A1. 道路修建 Small Time Limit: 1000ms Memory Limit: 131072KB 64-bit integer IO format: %lld Java cl ...
- P1629八
P1629八 Accepted 标签:[显示标签] 描述 八是个很有趣的数字啊.八=发,八八=爸爸,88=拜拜.当然最有趣的还是8用二进制表示是1000.怎么样,有趣吧.当然题目和这些都没有关 ...
- Spring Boot + MyBatis + MySQL 实现读写分离
读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做. 读写分离有两种实现方式: 第一种是依靠中间件(比如:MyCat ...
- Clover支持目录多标签页
1.简介 Clover是Windows Explorer资源管理器的一个扩展, 为其增加类似谷歌 Chrome 浏览器的多标签页功能. 2.推荐用法 下面是我使用的Clover的截图: 可以看到同时打 ...
- MongoDB 安装及制作成windows服务
下载: 注:直接使用浏览器下载速度很慢,建议使用其他下载软件下载(比如:迅雷) 官网下载地址: https://fastdl.mongodb.org/win32/mongodb-win32-x86_ ...