首页 > 其他分享 >11-gormV2-07-删除

11-gormV2-07-删除

时间:2023-06-28 13:55:04浏览次数:68  
标签:11 gormV2 07 删除 db sqlDB User gorm users

1. 按主键删除

1.1 使用

  • 说明
    如果指定的不是主键,则会触发批量删除,但是没有Where的批量删除被gorm禁止。
  • 样例
db.Delete(&User{ID: 2})

或写做

db.Delete(&User{ID: 2},2)

1.2 完整示例

删除id=2 的一行

package main

import (
	"database/sql"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"time"
)

type User struct {
	ID int64
	Age int64
	Name string
	Email string
	Company string
}


func main() {
	db,sqlDB,_ := connect()
	defer sqlDB.Close()
	db.Delete(&User{ID: 2})
}



func connect() (db *gorm.DB,sqlDB *sql.DB,err error) {
	dsn := "root:40010355@tcp(127.0.0.1:3306)/crow?charset=utf8&parseTime=True&loc=Local"
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	sqlDB,_ = db.DB()
	if err != nil {
		fmt.Printf(err.Error())
		defer sqlDB.Close()
	}else {
		fmt.Printf("OK\n")
		sqlDB.SetMaxIdleConns(10)
		sqlDB.SetMaxOpenConns(100)
		sqlDB.SetConnMaxLifetime(time.Hour)
	}
	return
}

2. 非主键删除

2.1 使用

db.Where("name LIKE ?", "%Guan%").Delete(&User{})

或写作

db.Delete(User{},"name LIKE ?","%Guan%")

2.2 示例

  • 表中原有数据
mysql> select * from users ;
+----+------------+------+
| id | name       | age  |
+----+------------+------+
|  1 | LiuBei     |   28 |
|  2 | GuanYu     |   22 |
|  3 | ZhangFei   |   20 |
|  4 | ZhaoYun    |   18 |
|  5 | ZhuGeLiang |   20 |
|  6 | GuanPing   |    3 |
+----+------------+------+
6 rows in set (0.00 sec)
  • 代码

上例main函数修改如下:

func main() {
	db,sqlDB,_ := connect()
	defer sqlDB.Close()

	result := db.Where("name LIKE ?", "%Guan%").Delete(&User{}).RowsAffected
	fmt.Println(result)
}
  • 表修改后
mysql> select * from users ;
+----+------------+------+
| id | name       | age  |
+----+------------+------+
|  1 | LiuBei     |   28 |
|  3 | ZhangFei   |   20 |
|  4 | ZhaoYun    |   18 |
|  5 | ZhuGeLiang |   20 |
+----+------------+------+
4 rows in set (0.00 sec)

如上,关家将都被删除

3. 全局删除

gorm禁止全局删除,如果要全局删除,可以

  • 指定一些条件
db.Where("1 = 1").Delete(&User{})
  • 使用原生sql
db.Exec("DELETE FROM users")

4. 软删除

4.1 使用

  • 说明
    实际是给deleted列加了一个删除时间
    deleted列必须存在,模型中必须有成员 Deleted 且类型为 gorm.DeletedAt,否则直接删除。
  • 定义模型

模型中必须有成员 Deleted

type User struct {
	ID int64
	Age int64
	Name string
	Email string
	Company string
	Deleted gorm.DeletedAt
}
  • 删除的代码

删除的代码和普通删除没有差别

db.Delete(&User{ID: 2})

4.2 完整示例

  • 原有表
mysql> select * from users;
+----+----------+------+--------------------+---------+---------+
| id | name     | age  | email              | company | deleted |
+----+----------+------+--------------------+---------+---------+
|  1 | LiuBei   |   28 | [email protected]   | shu     | NULL    |
|  2 | GuanYu   |   22 | [email protected]   | shu     | NULL    |
|  3 | ZhangFei |   20 | [email protected] | shu     | NULL    |
+----+----------+------+--------------------+---------+---------+
3 rows in set (0.00 sec)
  • 代码
package main

import (
	"database/sql"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"time"
)

type User struct {
	ID int64
	Age int64
	Name string
	Email string
	Company string
	Deleted gorm.DeletedAt
}


func main() {
	db,sqlDB,_ := connect()
	defer sqlDB.Close()

	db.Delete(&User{ID: 1})
}



func connect() (db *gorm.DB,sqlDB *sql.DB,err error) {
	dsn := "root:40010355@tcp(127.0.0.1:3306)/crow?charset=utf8&parseTime=True&loc=Local"
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	sqlDB,_ = db.DB()
	if err != nil {
		fmt.Printf(err.Error())
		defer sqlDB.Close()
	}else {
		fmt.Printf("OK\n")
		sqlDB.SetMaxIdleConns(10)
		sqlDB.SetMaxOpenConns(100)
		sqlDB.SetConnMaxLifetime(time.Hour)
	}
	return
}
  • 表结果
mysql> select * from users;
+----+----------+------+--------------------+---------+---------------------+
| id | name     | age  | email              | company | deleted             |
+----+----------+------+--------------------+---------+---------------------+
|  1 | LiuBei   |   28 | [email protected]   | shu     | 2022-02-13 19:22:31 |
|  2 | GuanYu   |   22 | [email protected]   | shu     | NULL                |
|  3 | ZhangFei |   20 | [email protected] | shu     | NULL                |
+----+----------+------+--------------------+---------+---------------------+
3 rows in set (0.00 sec)

4.3 软删除查询

4.2.1 说明

  • 软删除的行,使用gorm查询时是查不到的
  • 需要用Unscoped()查询软删除数据
db.Unscoped().Find(&users)
  • 彻底删除软删除数据
db.Unscoped().Delete(&User{ID: 1})

4.3.2 示例

  • gorm 直接查询查不到软删除
func main() {
	db,sqlDB,_ := connect()
	defer sqlDB.Close()
    var users []User
	db.Find(&users)
	fmt.Println(users)
}

输出

OK
[{2 22 GuanYu [email protected] shu {0001-01-01 00:00:00 +0000 UTC false}} {3 20 ZhangFei [email protected] shu {0001-01-01 00:00:00 +0000 UTC false}}]
  • 使用Unscoped()查询
func main() {
	db,sqlDB,_ := connect()
	defer sqlDB.Close()
    var users []User
	db.Unscoped().Find(&users)
	fmt.Println(users)
}

结果

如下:可以查到软删除的刘备信息

OK
[{1 28 LiuBei [email protected] shu {2022-02-13 19:22:31 +0800 CST true}} {2 22 GuanYu [email protected] shu {0001-01-01 00:00:00 +0000 UTC false}} {3 20 ZhangFei [email protected] shu {0001-01-01 00:00:00 +0000 UTC false}}]
  • 彻底删除被软删除数据
func main() {
	db,sqlDB,_ := connect()
	defer sqlDB.Close()
    var users []User
	db.Unscoped().Delete(&User{ID: 1})
	fmt.Println(users)
}

标签:11,gormV2,07,删除,db,sqlDB,User,gorm,users
From: https://www.cnblogs.com/crow1840/p/17511213.html

相关文章

  • 二、Windows11平台下Visual Studio 2022配置32位汇编环境
    1.下载VisualStudio20222.安装选择工作负载3.创建新项目3.1选择空项目模板3.2填写项目名称和解决方案项目名称:实际项目名称解决方案名称:一个解决方案下可以管理多个项目,并且可以选择一个项目为启动项目,当点击运行与调试后,就会启动被选择为启动项目的项目3.3实......
  • FX110网WeTrade众汇平台:交易者应该使用 MT4 还是 MT5?
    比较MT4和MT5是许多外汇交易者感兴趣的话题。这两款软件均由MetaQuotes开发,广泛应用于外汇交易行业。尽管两者都提供交易工具和功能,但它们之间存在重要差异。在本文中,FX110网上的交易商WeTrade众汇平台将探讨和比较MT4和MT5,以帮助您选择适合您的交易需求和目标的软件。MT4和M......
  • 编程初学者入门11_井字棋游戏、进制转换、订闹钟(时间换算)
    一、井字棋游戏题目描述KiKi和BoBo玩“井”字棋。也就是在九宫格中,只要任意行、列,或者任意对角线上面出现三个连续相同的棋子,就能获胜。请根据棋盘状态,判断当前输赢。输入描述:三行三列的字符元素,代表棋盘状态,字符元素用空格分开,代表当前棋盘,其中元素为K代表KiKi玩家的棋子,为O表......
  • PTA实验实验7~11的总结及分析
    1.前言自上次的博客又过去了一个多月,经过一段时间对Java的学习我们也迎来了期末考试了。这几次pta是期末前的最后几次pta,考察了菜单程序和课程程序,难度较之前有所提升,在下面分析一下。2.设计与分析7-1菜单计价程序-5首先是这道题,本题在菜单计价程序-3的基础上增加了部分内容,......
  • PTA7-11总结
     一.前言PTA-7考察了菜单计价程序的迭代,主要考察类的基本结构设计,对输入字符串进行处理,对输入时间的处理,以及对输入的不同类型的菜品数据分类处理,难点在于输入数据的处理和判断输入异常,难度一般,题量少。PTA-8考察了课程成绩统计程序的第一次,主要考察一些类基本的结构设计,一些......
  • 题目集7~11的总结性Blog
    一、前言(1)pta第七次作业题目列表如下:7-1 菜单计价程序-5总结:这个菜单计价1程序-5是前菜单计价程序-3的迭代,难度较之前的有所提升,题目难度对我来说感觉很大,写了很久也没有拿下。(2)pta第八次作业题目列表如下:7-1课程成绩统计程序-1总结:总算是熬过了菜单,迎来了新的课......
  • oop题目集7~11的总结性Blog
    目录一、前言二、设计与分析:一、前言4~6的训练集难度较上一次提升很多,训练了很多java中独有的提供好的方法,如hashset,数组的sort等方法,实现了代码运行时间的优化,和内存的占用减少,学会了代码的封装,和使用类间关系,同时了解并使用了正则表达式,了解Scanner类中nextLine()等方法、Str......
  • 11.performance_schema_01
    1.Mysql的performance_schema是运行在较低级别的用于监控mysqlserver运行过程中资源消耗、资源等待的一个功能。2.查看当前是否支持root@mysqldb21:14:[performance_schema]>showengines;+--------------------+---------+--------------------------------------------......
  • OO题目集7-11总结
    一、前言本次题目集横跨时间较长,也是本课程的最后一次总结了,回首看第一次OO总结,真的感觉今时不同往日了,不仅仅是在能力上的提升,在各方各面上无疑都觉得已经成长了许多(变成了puls版小菜鸡)。题目集七本次题目集是菜单3的与菜单4不同迭代分支,是对于菜单3的另一个迭代方向,只要考察......
  • 力扣---1186. 删除一次得到子数组最大和
    给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中最......