文章目录

  • 添加单条记录
    • 直接添加模型对象
    • 赋予默认值方法一: gorm 标签
    • 赋予默认值方法二: 设置钩子方法(Hooks)
    • 指定字段插入
    • 插入时忽略某些字段
    • 插入时禁止使用钩子方法
  • 添加多条记录
    • 通过对象列表插入
    • 通过字典列表插入
    • 在字典中使用SQL内置函数
  • 关联插入
  • 取消关联插入
    • 取消指定关联插入
    • 取消所有关联插入
  • 冲突
    • 忽略冲突
    • 出现冲突修改行记录
      • 出现冲突时,修改字段为新的值
      • 出现冲突时,修改指定字段为新的值
      • 出现冲突时,修改指定字段内容
      • 使用内置函数

模型定义以及Gorm初始化请参考上一篇文章 https://mingvvv.blog.csdn.net/article/details/129026914

首先初始化连接池

db := cus_orm.MysqlConnection()

添加单条记录

直接添加模型对象

使用 Debug() 可以打印出 SQL 语句,开发时使用便于观察

user := &model.User{Name: "姓名",
}
// 添加一条
if err := db.Debug().Create(user).Error; err != nil {fmt.Println(err)return
}
-------------------------------------------
INSERT INTO `user` (`name`,`infant_name`,`age`,`user_desc`,`json_field`,`create_time`,`update_time`) VALUES ('姓名','',18,'这是一条默认描述',NULL,'2023-03-01 15:24:56','2023-03-01 15:24:56')

这里的对象中我们只给 Name 赋值,但是在实际执行的 SQL 中其他字段也有值,原因如下:

赋予默认值方法一: gorm 标签

赋予默认值方法二: 设置钩子方法(Hooks)

为结构体添加以下方法:

在模型对象创建的时候会依次调用这四个方法,执行循序为
BeforeSave => BeforeCreate => AfterCreate => AfterSave
因此我们可以在这些方法里面对对象做一些操作,如下,对CreateTime、UpdateTime、 UserDesc 做了简单的赋值

... ...
func (u *User) BeforeCreate(tx *gorm.DB) (err error) {u.CreateTime = time.Unix(time.Now().Unix(), 0) //初始化创建时间u.UpdateTime = time.Unix(time.Now().Unix(), 0) //初始化修改时间u.UserDesc = "这是一条默认描述"fmt.Println("BeforeCreate -- Auto Setting")return
}
... ...

指定字段插入

db.Debug().Select("Name").Create(&user)
db.Debug().Select("Name","UserDesc").Create(&user)
---------------------------
INSERT INTO `user` (`name`) VALUES ('姓名')
INSERT INTO `user` (`name`,`user_desc`) VALUES ('姓名','这是一条默认描述')

插入时忽略某些字段

忽略 UpdateTime

db.Debug().Omit("UpdateTime").Create(&user)
----------------------------------------------
INSERT INTO `user` (`name`,`infant_name`,`age`,`user_desc`,`json_field`,`create_time`,`id`) VALUES ('姓名','',18,'这是一条默认描述',NULL,'2023-03-01 15:50:59',539)

插入时禁止使用钩子方法

有的时候我们在保存时可能不需要狗子方法帮我们预处理数据,所以我们要禁用钩子方法
使用 Session(&gorm.Session{SkipHooks: true}),会发现我们上面在钩子方法没有执行

import "gorm.io/gorm"
db.Debug().Omit("UpdateTime").Session(&gorm.Session{SkipHooks: true}).Create(&user)
-------------------------------------------
INSERT INTO `user` (`name`,`infant_name`,`age`,`user_desc`,`json_field`,`create_time`,`update_time`) VALUES ('姓名','',18,'',NULL,'0000-00-00 00:00:00','0000-00-00 00:00:00')

添加多条记录

通过对象列表插入

CreateInBatches(&users, 100) 100表示每次插入的最大行数量。列表内的对象数量大于这个值时会分批次插入,每批次最大 100 行

users := []model.User{{Name: "测试goper111",},{Name: "测试goper222",},{Name: "测试goper333",},
}
db.Debug().CreateInBatches(&users, 100)
--------------------------------------------------------------------
INSERT INTO `user` (`name`,`infant_name`,`age`,`user_desc`,`json_field`,`create_time`,`update_time`) VALUES
('测试goper111','',18,'这是一条默认描述',NULL,'2023-03-01 16:04:18','2023-03-01 16:04:18'),
('测试goper222','',18,'这是一条默认描述',NULL,'2023-03-01 16:04:18','2023-03-01 16:04:18'),
('测试goper333','',18,'这是一条默认描述',NULL,'2023-03-01 16:04:18','2023-03-01 16:04:18')

通过字典列表插入

db.Model(&model.User{}).Debug().Create([]map[string]interface{}{{"Name": "姓名1", "Age": 18},{"Name": "姓名2", "Age": 20},
})
-------------------
INSERT INTO `user` (`age`,`name`) VALUES
(18,'姓名1'),
(20,'姓名2')

在字典中使用SQL内置函数

使用 clause.Expr{SQL: “内置函数”, Vars: []interface{}{参数对象}}

import "gorm.io/gorm/clause"db.Model(&model.User{}).Debug().Create([]map[string]interface{}{{"Name": clause.Expr{SQL: "Concat(?,?)", Vars: []interface{}{"姓名", "拼接"}}, "Age": 18},
})
----------------------------------------
INSERT INTO `user` (`age`,`name`) VALUES (18,Concat('姓名','拼接'))

还有一种方法也可以使用内置函数,但是需要提前自定义数据类型,比较繁琐。
实现过程可参考以下地址

https://gorm.io/docs/data_types.html#GormValuerInterface

关联插入

在结构体 User 中,我们最后两个字段关联了其他两个表。



如果我们要插入的对象中,这两个元素不是空值,那么这两个结构体对应的表也会插入数据。
需要注意的是:
上图红框中我们制定了外键关系,即这两个表的 user_id 就是 user 表的外键,所以在插入时,这两个表的 user_id 会自动赋值为 user 表的 id

user2 := &model.User{Name: "姓名",UserRole: model.UserRole{RoleId: 1,},UserExtend: model.UserExtend{Gender: 1,},
}
db.Debug().Create(&user2)
--------------------------------------------
INSERT INTO `user_role` (`user_id`,`role_id`) VALUES (546,1) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)
INSERT INTO `user_extend` (`user_id`,`gender`) VALUES (546,1) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)
INSERT INTO `user` (`name`,`infant_name`,`age`,`user_desc`,`json_field`,`create_time`,`update_time`) VALUES ('姓名','',18,'这是一条默认描述',NULL,'2023-03-01 16:22:25','2023-03-01 16:22:25')

取消关联插入

取消指定关联插入

以下取消了 user_role 表的关联插入

user2 := &model.User{Name: "姓名",UserRole: model.UserRole{RoleId: 1,},UserExtend: model.UserExtend{Gender: 1,},
}
db.Debug().Omit("UserRole").Create(&user2)
-----------------------------------------
INSERT INTO `user_extend` (`user_id`,`gender`) VALUES (547,1) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)
INSERT INTO `user` (`name`,`infant_name`,`age`,`user_desc`,`json_field`,`create_time`,`update_time`) VALUES ('姓名','',18,'这是一条默认描述',NULL,'2023-03-01 16:29:09','2023-03-01 16:29:09')

取消所有关联插入

import "gorm.io/gorm/clause"
user2 := &model.User{Name: "姓名",UserRole: model.UserRole{RoleId: 1,},UserExtend: model.UserExtend{Gender: 1,},
}
db.Debug().Omit(clause.Associations).Create(&user2)
-----------------------------------------
INSERT INTO `user` (`name`,`infant_name`,`age`,`user_desc`,`json_field`,`create_time`,`update_time`) VALUES ('姓名','',18,'这是一条默认描述',NULL,'2023-03-01 16:29:09','2023-03-01 16:29:09')

冲突

我们在创建表的时候会创建一些唯一索引,这样的索引对应的列在表内是不允许存在重复数据的。
当我们插入了重复数据后,插入会报错。针对这种情况,我们可以忽略这些冲突或者将插入操作转变为修改操作。

忽略冲突

当出现冲突时,将id修改为id,实质上相当于什么也没做

user := &model.User{Id:        521,Name:      "姓名",JsonField: map[string]string{"test": "test"},
}
db.Debug().Clauses(clause.OnConflict{DoNothing: true}).Create(&user)
--------------------------------------------------
INSERT INTO `user` (`name`,`infant_name`,`age`,`user_desc`,`json_field`,`create_time`,`update_time`,`id`)
VALUES ('姓名','',18,'这是一条默认描述','{"test":"test"}','2023-03-01 16:55:24','2023-03-01 16:55:24',521)
ON DUPLICATE KEY UPDATE `id`=`id`

出现冲突修改行记录

出现冲突时,修改字段为新的值

user := &model.User{Id:        521,Name:      "姓名",JsonField: map[string]string{"test": "test"},
}
db.Debug().Clauses(clause.OnConflict{UpdateAll: true}).Create(&user)
---------------------------------------
INSERT INTO `user` (`name`,`infant_name`,`age`,`user_desc`,`json_field`,`create_time`,`update_time`,`id`)
VALUES ('姓名','',18,'这是一条默认描述','{"test":"test"}','2023-03-01 17:20:13','2023-03-01 17:20:13',521)
ON DUPLICATE KEY UPDATE `name`=VALUES(`name`),`infant_name`=VALUES(`infant_name`),`age`=VALUES(`age`),`user_desc`=VALUES(`user_desc`),`json_field`=VALUES(`json_field`),`create_time`=VALUES(`create_time`),`update_time`=VALUES(`update_time`)

出现冲突时,修改指定字段为新的值

db.Debug().Clauses(clause.OnConflict{DoUpdates: clause.AssignmentColumns([]string{"json_field", "name"}),
}).Create(&user)
---------------------------------------
INSERT INTO `user` (`name`,`infant_name`,`age`,`user_desc`,`json_field`,`create_time`,`update_time`,`id`)
VALUES ('姓名','',18,'这是一条默认描述','{"test":"test"}','2023-03-01 17:17:35','2023-03-01 17:17:35',521)
ON DUPLICATE KEY UPDATE `user_desc`=VALUES(`user_desc`),`name`=VALUES(`name`)

出现冲突时,修改指定字段内容

db.Debug().Clauses(clause.OnConflict{DoUpdates: clause.Assignments(map[string]interface{}{"user_desc": "冲突后做了修改"}),
}).Create(&user)
--------------------------------------------------
INSERT INTO `user` (`name`,`infant_name`,`age`,`user_desc`,`json_field`,`create_time`,`update_time`,`id`)
VALUES ('姓名','',18,'这是一条默认描述','{"test":"test"}','2023-03-01 16:51:45','2023-03-01 16:51:45',521)
ON DUPLICATE KEY UPDATE `user_desc`='冲突后做了修改'

使用内置函数

db.Debug().Clauses(clause.OnConflict{DoUpdates: clause.Assignments(map[string]interface{}{"user_desc": gorm.Expr("Concat('测试', '拼接')")}),
}).Create(&user)
--------------------------------------------------
INSERT INTO `user` (`name`,`infant_name`,`age`,`user_desc`,`json_field`,`create_time`,`update_time`,`id`)
VALUES ('姓名','',18,'这是一条默认描述','{"test":"test"}','2023-03-01 17:15:17','2023-03-01 17:15:17',521)
ON DUPLICATE KEY UPDATE `user_desc`=Concat('测试', '拼接')

Gorm -- 添加记录相关推荐

  1. 用Java Instrumentation 在类加载时添加记录

    用Java Instrumentation 在类加载时添加记录 发布者:xanadu0214   来源:网络转载   发布日期:2013年11月06日   Java学习交流群:471651004 在分 ...

  2. mybatis添加记录时返回主键id

    参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作. 在使用mybatis作为ORM组件时,可以很方便地达到这 ...

  3. 使用DataSet对象添加记录

    使用DataSet对象添加记录 使用DataSet对象添加记录 步骤: ●创建Connection对象 ●创建DataAdapter对象 ●通知数据适配器我们要使用的连接 ●创建一个DataSet对象 ...

  4. mysql创建数据库时候同时创建表空间_mysql::创建多个表空间添加记录数据会添加到哪个表空间中?...

    问题:创建多个表空间添加记录数据会添加到哪个表空间中 答:后一个 drwx------ 2 mysql mysql 4.0K Apr 26 08:04 demo -rw-rw---- 1 mysql ...

  5. PHP中mysql如何添加记录_PHP向MySql提交数据添加记录的简单代码_PHP教程

    今天有位站长咨询烈火一个特别简单的问题--如何使用PHP向Mysql添加记录?现在就把一个简单的存储数据的代码给出来,稍加几句分析,高手就不要看了,非常基础的例子. PHP向MySQL数据库中写入数据 ...

  6. 在GridView控件FooterTemplate内添加记录 Ver2

    中午有发表一篇博文<在GridView控件FooterTemplate内添加记录> http://www.cnblogs.com/insus/p/3269908.html 添加铵钮是放在F ...

  7. 【SQL练习】创建表格,并添加记录

    1.创建表格结构  2.添加记录  代码: 1.创建表格: drop table work; drop table employee; drop table department;create tab ...

  8. 易语言教程数据库写和添加记录

    本课 示范了写().加记录().加空记录()三个命令的使用方法. 视频链接: 511遇见易语言教程数据库 添加记录 (1)手动添加 (2)代码添加 使用代码添加和修改记录,主要有以下几个命令: &qu ...

  9. Mysql数据库中插入记录的命令_向数据库中添加记录的sql命令是什么

    向数据库中添加记录的sql命令是INSERT INTO. (推荐学习:mysql教程) INSERT INTO 语句的语法 INSERT INTO 语句可以有两种编写形式,分别是: 第一种形式 无需指 ...

最新文章

  1. Logstic与Softmax比较
  2. 异常处理汇总-后端系列
  3. Android 微信支付详解与Demo
  4. r语言必学的十个包肖凯_30 天学会R DAY 14:R语言必学包dplyr
  5. Selenium for C#的入门Demo
  6. 05.序列模型 W1.循环序列模型
  7. centos7 关闭防火墙的指令_CentOS7 怎么安装配置chrony时间同步服务?
  8. python课设答辩问题及答案_HTML5网站前端开发设计答辩问题及答案
  9. 95-20-025-启动器-AbstractBootstrap
  10. 问题:使用pandas中的DataFrame写入csv文件多出一行unnamed,如何解决呢??
  11. gflags.lib(gflags.obj) : error LNK2001: 无法解析的外部符号 __imp_PathMatchSpecA
  12. eve-ng 添加dynamips镜像文件
  13. 2022-2028年中国有色金属市场供需前景预测及投资策略研究报告
  14. Spark生态之Alluxio学习15--alluxio性能分析和加速方式
  15. 这几款手机浏览器真的牛,比夸克更好用
  16. JAVA 将唐诗按照古文样式输出
  17. H3BPM实例分享——金额规则大写
  18. Python中的string和bytes的转换
  19. 学习笔记(一)Mobilenetv1的解读
  20. Python杀死Excel?众多模块哪家强

热门文章

  1. Mac OS(适用MacBook Pro) 命令行和快捷键
  2. cursor 属性:
  3. 用pc构建DIY计算集群
  4. 精准找到B站大家爱看的王冰冰——用Python
  5. Lua⭐️迭代器pairs、ipairs ; 自定义迭代器
  6. 搭建高可用的MongoDB集群(一):MongoDB的配置与副本集
  7. 【模型加速】PointPillars模型TensorRT加速实验(1)
  8. Windows注册表Userinit建简介与丢失后(系统无法登录)恢复办法
  9. 浏览器未安装flash插件
  10. 5-1中央处理器-CPU的功能和基本结构