1.  简单创建记录

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

  

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

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

  

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

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

  

4.  批量插入

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

  

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

  1. func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
  2. u.UUID = uuid.NewV4()
  3.  
  4. if u.Role == "admin" {
  5. fmt.Println("执行失败了")
  6. return errors.New("invalid role")
  7. }
  8. return
  9. }

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

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

  

6.  根据Map创建

  1. db.Model(&User{}).Create(map[string]interface{}{
  2. "Name": "jinzhu", "Age": 18,
  3. })
  4.  
  5. db.Model(&User{}).Create([]map[string]interface{}{
  6. {"Name": "jinzhu_1", "Age": 18},
  7. {"Name": "jinzhu_2", "Age": 20},
  8. })

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

7.  关联创建

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

  1. type BaseModel struct {
  2. Age uint8
  3. Address string
  4. UserID uint
  5. }
  6. func (b *BaseModel) BeforeCreate(tx *gorm.DB) (err error) {
  7. fmt.Println("BaseModel 的 BeforeCreate执行了")
  8. return
  9. }
  10. type User struct {
  11. ID uint `gorm:"primaryKey;autoincrement"`
  12. BaseModel BaseModel
  13. Name string
  14. UUID uuid.UUID
  15. Role string
  16. }
  17.  
  18. func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
  19. u.UUID = uuid.NewV4()
  20.  
  21. if u.Role == "admin" {
  22. fmt.Println("执行失败了")
  23. return errors.New("invalid role")
  24. }
  25. return
  26. }

  1. // 关联创建
    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 跳过关联保存,例如:

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

  跳过所有关联

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

  

8.  默认值

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

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

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

  

9.  Upsert 及冲突

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

  1. ret := db.Clauses(clause.OnConflict{DoNothing: true}).Create(&User{ID: 4, Name: sql.NullString{"你好啊", true}})
  2. 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. 【LeetCode】215. Kth Largest Element in an Array 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:移除最大值 方法二:排序 方法三:大顶堆 方 ...

  2. 【LeetCode】166. Fraction to Recurring Decimal 解题报告(Python)

    [LeetCode]166. Fraction to Recurring Decimal 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingz ...

  3. 【LeetCode】877. Stone Game 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学 双函数 单函数 + 记忆化递归 动态规划 日期 ...

  4. 【LeetCode】888. Fair Candy Swap 公平的糖果棒交换(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人公众号: 每日算法题 本文关键词:力扣,LeetCode,算法题,算法,Python 目录 题目描述 题目大意 解题方法 代码 刷题心得 关于作 ...

  5. 【剑指Offer】连续子数组的最大和 解题报告(Python)

    [剑指Offer]连续子数组的最大和 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  6. Network (poj1144)

    A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting se ...

  7. Essentially No Barriers in Neural Network Energy Landscape

    目录 梗概 主要内容 path的定义 path的逼近 Mechanical Model Nudged Elastic Band 局部最优 Draxler F, Veschgini K, Salmhof ...

  8. [数据结构]链表LinkList

    目录 1.3 链表 1.3.1 头插法建立单链表 1.3.2 限制链表长度建立单链表 1.3.3 尾插法建立单链表 1.3.4 按序号查找单链表 1.3.5 按值查找单链表 1.3.6 链表的插入 1 ...

  9. <学习opencv>图像和大型阵列类型

    OPenCV /*=========================================================================*/ // 图像和大型阵列类型 /* ...

  10. HTML网页设计基础笔记 • 【第5章 常用的样式属性】

    全部章节   >>>> 本章目录 5.1 字体及文本属性 5.1.1 字体属性 5.1.2 文本属性 5.2 边距和填充 5.2.1 边距 5.2.2 填充 5.3 边框属性 ...