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 中文官方网站内含十分齐全的中文文档,有了它你甚至不需要再继续向下阅读本文 ...
随机推荐
- 使用docker-compose一起安装kafka(zookeeper)
要先安装docker-compose Linux安装docker-compose 参考:https://www.cnblogs.com/pxblog/p/15049362.html 创建docker- ...
- 【LeetCode】1012. Complement of Base 10 Integer 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】380. Insert Delete GetRandom O(1) 解题报告(Python)
[LeetCode]380. Insert Delete GetRandom O(1) 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxu ...
- Java初学者作业——编写Java程序,输入一个数字,实现该数字阶乘的计算。
返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个数字,实现该数字阶乘的计算.一个数字的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n! .例如,5的阶乘等于1*2*3*4* ...
- Hexo博客部署到腾讯云服务器全过程(Nginx,证书,HTTPS),你要的这里都有
背景 说来也惭愧,博客已经搭建很久了,一直免费的部署在 Coding 和 Github Pages 上,前者迁移到腾讯云 Serverless,导致原有的配置始终有问题,没时间仔细研究,刚好腾讯服务器 ...
- 在本地开启了代理,postman可以正常发起外部请求,但Java代码却请求失败,已解决
在本地开启了代理,postman可以正常发起外部请求,但Java代码却请求失败,已解决 现象:开了vpn访问公司服务器,postman可以正常发起服务器请求,但是java代码请求失败,连接超时.包括在 ...
- 数据库SQL语言类型(DQL.DML.DDL.DCL)
1.SQL语言 SQL(Structure Query Language)语言是数据库的核心语言. SQL是一个标准的数据库语言, 是面向集合的描述性非过程化语言. 它功能强,效率高,简单易学易维护. ...
- MySQL数据库安装Version5.7
MySQL数据库版本: mysql-5.7.22-linux-glibc2.12-x86_64 Linux服务器系统: CentOS 7.4 64bit MySQL安装用户: mysql/aliyun ...
- 一键抠除路人甲,昇腾CANN带你识破神秘的“AI消除术”
摘要:都说人工智能改变了生活,你感觉到了么?AI的魔力就在你抠去路人甲的一瞬间来到了你身边.今天就跟大家聊聊--神秘的"AI消除术". 引语 旅途归来,重温美好却被秀丽河山前的路人 ...
- Swoole 中使用 Atomic 实现进程间无锁计数器
使用示例: $atomic = new Swoole\Atomic(); $serv = new Swoole\Server('127.0.0.1', '9501'); $serv->set([ ...