GORM—增

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 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}


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
SQL 数据库
GORM—删
GORM—删
77 0
|
7月前
|
SQL 数据库 索引
gorm普通的增删改查
gorm普通的增删改查
68 0
|
7月前
|
数据库
gorm 事务的使用
gorm 事务的使用
157 0
|
7月前
|
SQL 数据库
GORM—查
GORM—查
66 0
|
7月前
|
SQL
GORM—改
GORM—改
39 0
|
关系型数据库 MySQL 数据库
GORM V2 读操作
GORM V2 读操作
50 1
|
SQL 安全 数据库
GORM V2 写操作
GORM V2 写操作
60 0
|
SQL
GORM中使用事务
GORM中使用事务
144 0
|
SQL 关系型数据库 MySQL
MySQL中的DML操作(增、删、改)
MySQL中数据的DML操作(增、删、改) 1. 新增(INSERT) INSERT INTO 表名 (列1,列2,列3...) VALUES(值1,值2,值3.....) #新增一条数据 INSERT INTO t_countries(COUNTRY_ID,COUNTRY_NAME) VALUES ('CH','中国'); #增加两条数据 #多行添加,在值列表外边追加,再写一个值列表 INS...
107 0
|
Go
GORM v2 一对一关联查询使用(Belongs To 、Has One)
GORM v2 一对一关联查询使用(Belongs To 、Has One)
436 0
GORM v2 一对一关联查询使用(Belongs To 、Has One)