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 中文官方网站内含十分齐全的中文文档,有了它你甚至不需要再继续向下阅读本文 ...
随机推荐
- Chrome导出导入书签
Chrome导出标签 Chrome导入书签
- SpringCloud使用GateWay网关前端请求请求跨域处理
增加配置类 CorsConfig.java import org.springframework.context.annotation.Bean; import org.springframework ...
- JAVA使用经纬度通过腾讯地图API获取详细地址
官方文档:https://lbs.qq.com/service/webService/webServiceGuide/webServiceGcoder package com.weixin.map; ...
- C语言之可变长参数格式化
概述 本文演示环境: win10 + Vs2015 可变长参数格式化 两个概念: 1. 参数长度不定, 2. 参数格式化. 使用函数 vsnprintf 结合 va_list. 源码 写好了函数, 照 ...
- 【LeetCode】702. Search in a Sorted Array of Unknown Size 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 二分查找 日期 题目地址:https://lee ...
- 【LeetCode】673. Number of Longest Increasing Subsequence 解题报告(Python)
[LeetCode]673. Number of Longest Increasing Subsequence 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https:/ ...
- Linux磁盘实用指令
磁盘情况查询 df/du 查询磁盘整体占用情况 df 指令:df -h 查询目录磁盘占用情况 du 基本语法 指令:du [选项] 指定目录 常用选项 指定目录不填则默认当前目录 选项 功能 -s 指 ...
- 「影院售票系统」 · Java Swing + MySQL JDBC开发
目录 文档说明: 一.语言和环境 二.实现功能 三.数据库设计 四.具体要求及推荐实现步骤 五.注意事项 六.评分标准 实现代码: 一.数据库: 二.Java Swing: com.ynavc.Bea ...
- docker学习:docker三要素
镜像 docker 镜像(image)就是一个只读的模板.镜像可以用来创建docker容器,一个镜像可以创建很多容器 容器 docker 利用容器(Container)独立运行的一个或者一组应用.容器 ...
- Java中两个或多个byte数组合并及int类型转数组
Java中两个或多个byte数组合并及int类型转数组 // 用list好处是可以未知多个? public static byte[] test(List<byte[]> values) ...