GORM—增

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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}


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5月前
|
SQL 数据库
GORM—删
GORM—删
61 0
|
5月前
|
SQL 数据库 索引
gorm普通的增删改查
gorm普通的增删改查
62 0
|
5月前
|
数据库
gorm 事务的使用
gorm 事务的使用
114 0
|
5月前
|
SQL 数据库
GORM—查
GORM—查
49 0
|
5月前
|
SQL
GORM—改
GORM—改
36 0
|
关系型数据库 MySQL 数据库
GORM V2 读操作
GORM V2 读操作
42 1
|
SQL 安全 数据库
GORM V2 写操作
GORM V2 写操作
45 0
|
SQL
GORM中使用事务
GORM中使用事务
127 0
|
Go
GORM v2 一对一关联查询使用(Belongs To 、Has One)
GORM v2 一对一关联查询使用(Belongs To 、Has One)
411 0
GORM v2 一对一关联查询使用(Belongs To 、Has One)
|
SQL
gorm批量插入解决方案
gorm批量插入解决方案
1034 0
gorm批量插入解决方案