GORM—增

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: GORM—增

创建

  小知识:在GORM语句前面增加.DeBug(),即可看到执行的Sql语句

  db.NewRecord(user)返回主键是否为空

  这里发现插入时并没有插入主键,但是这里主键是自增的,需要注意的是,传入的user实例的id被赋值了

type User struct {
  ID   int64
  Name string
  Age  int64
}
func main() {
  db, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local")
  if err != nil {
    panic(err)
  }
  defer db.Close()
  // 自动迁移
  db.AutoMigrate(&User{})
  user := User{Name: "武旭飞", Age: 20}
  fmt.Println(user, db.NewRecord(user)) // 主键为空返回`true`
  db.Debug().Create(&user)              // 创建user
  fmt.Println(user, db.NewRecord(user)) // 创建`user`后返回`false`
}
{0 武旭飞 20} true
(C:/Users/68725/Desktop/leetcode/main.go:27) 
[2022-05-12 17:46:43]  [1.21ms]  INSERT INTO `users` (`name`,`age`) VALUES ('武旭飞',20)  
[1 rows affected or returned ] 
{4 武旭飞 20} false

设置默认值

  可以通过 tag 定义字段的默认值,比如:

type User struct {
  ID   int64
  Name string `gorm:"default:'飞飞飞'"`
  Age  int64
}
func main() {
  db, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local")
  if err != nil {
    panic(err)
  }
  defer db.Close()
  // 自动迁移
  db.AutoMigrate(&User{})
  user := User{Age: 3}
  db.Debug().Create(&user) // 创建user
  fmt.Println(user)
}

  通过tag设置默认值的字段,在GORM上传Sql语句的时候,会自动将值为零值的字段移除掉,即不写入Sql语句中,带记录插入数据库后,GORM会自动从数据库加载字段的默认值赋值给结构体实例。

(C:/Users/68725/Desktop/leetcode/main.go:25) 
[2022-05-12 17:54:15]  [1.22ms]  INSERT INTO `users` (`age`) VALUES (3)  
[1 rows affected or returned ] 
(C:/Users/68725/Desktop/leetcode/main.go:25) 
[2022-05-12 17:54:15]  [1.06ms]  SELECT `name` FROM `users`  WHERE (id = 5)  
[1 rows affected or returned ] 
{5 飞飞飞 3}
进程 已完成,退出代码为 0

想要插入零值

  由于设置了默认值之后,所有类型的零值,都不会保存到数据库中,而是保存他们的默认值,这就出现了一个问题:如果我想存0,或者""怎么办?

  如果出现这种情况,有两种办法可以解决

  1. 指针
  2. 实现Scanner/Valuer的接口

指针

使用指针方式实现零值存入数据库

// 使用指针
type User struct {
  ID   int64
  Name *string `gorm:"default:'飞飞飞'"`
  Age  int64
}
func main() {
  db, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local")
  if err != nil {
    panic(err)
  }
  defer db.Close()
  // 自动迁移
  db.AutoMigrate(&User{})
  user := User{Name: new(string), Age: 18}
  db.Debug().Create(&user) // 创建user
  fmt.Println(user)
}
[2022-05-12 17:59:18]  [3.79ms]  INSERT INTO `users` (`name`,`age`) VALUES ('',18)  
[1 rows affected or returned ] 
{1 0xc0001d27f0 18}

实现Scanner/Valuer的接口

使用Scanner/Valuer接口方式实现零值存入数据库

// 使用 Scanner/Valuer
type User struct {
  ID   int64
  Name sql.NullString `gorm:"default:'飞飞飞'"` // sql.NullString 实现了Scanner/Valuer接口
  Age  int64
}
func main() {
  db, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local")
  if err != nil {
    panic(err)
  }
  defer db.Close()
  // 自动迁移
  db.AutoMigrate(&User{})
  user := User{Name: sql.NullString{Valid: true}, Age: 18}
  db.Debug().Create(&user) // 创建user
  fmt.Println(user)
}
[2022-05-12 18:01:03]  [2.50ms]  INSERT INTO `users` (`name`,`age`) VALUES ('',18)  
[1 rows affected or returned ] 
{1 { true} 18}


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
存储 C++ 索引
哈希表、集合、映射
哈希表、集合、映射
|
5月前
|
人工智能 物联网 Android开发
【04】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-自定义一个设置输入小部件组件-完成所有设置setting相关的页面-优雅草卓伊凡
【04】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-自定义一个设置输入小部件组件-完成所有设置setting相关的页面-优雅草卓伊凡
284 92
|
11月前
|
移动开发 小程序 数据可视化
一招学会DIY官网可视化设计支持导出微擎、UNIAPP、H5、微信小程序源码
一招学会DIY官网可视化设计支持导出微擎、UNIAPP、H5、微信小程序源码
214 2
|
Java 测试技术
使用assert函数进行单元测试
使用assert函数进行单元测试
|
监控 安全 网络安全
宝鸡陇县中学弱电系统集成设计方案_kaic
宝鸡陇县中学弱电系统集成设计方案_kaic
|
存储 关系型数据库 MySQL
Mysql学习--深入探究索引和事务的重点要点与考点
Mysql学习--深入探究索引和事务的重点要点与考点
|
数据采集 数据可视化 安全
河北稳控科技采空区沉降监测系统解决方案
我国众多矿山已开采完毕,形成了巨大的采空区,尤其是井工矿的开采,尽管进行了回填,但是采空区地面在长时间的雨水和重力的作用下容易造成地面沉降,一旦沉降位移过大,就会给地上造成巨大的损失。河北稳控科技充分利用在自动化监测方面的技术积累,建立了一套科学完善的采空区监测预警平台,实现了采空区防治管理的科学化、信息化、标准化和可视化。为国家各级安全监督管理部门提供了一套可靠,实用、专业的采空区监测与预警系统解决方案。
河北稳控科技采空区沉降监测系统解决方案
|
搜索推荐
CPP2022-18-数组-插入排序
CPP2022-18-数组-插入排序
230 0
|
移动开发 前端开发 JavaScript
实现一个前端小画布
# canvas的介绍 在HTML5中` canvas `元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成. `<canvas>` 标签只是图形容器,您必须使用脚本来绘制图形。 可以通过多种方法使用 canvas 绘制路径,盒、圆、字符以及添加图像。 # 鼠标事件 我们可以分别控制三个鼠标事件来控制绘画的状态 ## mouseup 这是绑定的鼠标抬起的事件,鼠标抬起后会触发 ## mousedown 这是绑定的鼠标摁下的事件,鼠标摁下后会触发 ## mousemove 这是绑定的鼠标移动的事件,鼠标移动时会触发 ## 一个小实验 ``` <!DOC
|
JavaScript 前端开发
Odoo 自定义form表单按钮点击事件处理程序
Odoo 自定义form表单按钮点击事件处理程序
441 0