1. 按主键删除
1.1 使用
说明
如果指定的不是主键,则会触发批量删除,但是没有Where的批量删除被gorm禁止。
样例
或写做
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{})
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
}
删除的代码和普通删除没有差别
4.2 完整示例
mysql> select * from users;
+
| id | name | age | email | company | deleted |
+
| 1 | LiuBei | 28 | liubei@xishu .com | shu | NULL |
| 2 | GuanYu | 22 | guanyu@xishu .com | shu | NULL |
| 3 | ZhangFei | 20 | zhangfei@xishu .com | 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 | liubei@xishu .com | shu | 2022 -02 -13 19 :22 :31 |
| 2 | GuanYu | 22 | guanyu@xishu .com | shu | NULL |
| 3 | ZhangFei | 20 | zhangfei@xishu .com | 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 示例
func main () {
db,sqlDB,_ := connect()
defer sqlDB.Close()
var users []User
db.Find(&users)
fmt.Println(users)
}
输出
OK
[{2 22 GuanYu guanyu@xishu.com shu {0001 -01 -01 00 :00 :00 +0000 UTC false }} {3 20 ZhangFei zhangfei@xishu.com shu {0001 -01 -01 00 :00 :00 +0000 UTC false }}]
func main () {
db,sqlDB,_ := connect()
defer sqlDB.Close()
var users []User
db.Unscoped().Find(&users)
fmt.Println(users)
}
结果
如下:可以查到软删除的刘备信息
OK
[{1 28 LiuBei liubei@xishu.com shu {2022 -02 -13 19 :22 :31 +0800 CST true }} {2 22 GuanYu guanyu@xishu.com shu {0001 -01 -01 00 :00 :00 +0000 UTC false }} {3 20 ZhangFei zhangfei@xishu.com 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)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了