美文网首页
gorm-V2-07-删除

gorm-V2-07-删除

作者: 玄德公笔记 | 来源:发表于2022-02-17 20:17 被阅读0次

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 | 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 示例

  • gorm 直接查询查不到软删除
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}}]
  • 使用Unscoped()查询
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)
}

相关文章

  • gorm-V2-07-删除

    1. 按主键删除 1.1 使用 说明如果指定的不是主键,则会触发批量删除,但是没有Where的批量删除被gorm禁...

  • 删除!删除!

    我是展鹏教育的大邢老师,这是我加入日记星球的第77篇原创日记。 春季开学后就发现U盘不见了,怎么找都找不到,期待它...

  • 删除不了

    删除不了 删除不了 删除不了

  • 说说 Redis 缓存删除策略

    Redis 缓存删除策略分为定时删除、定期删除与惰性删除。前两个是主动删除,后一个是被动删除。 1 定时删除 为 ...

  • Linux命令行与Shell-----常用命令

    rm --删除 -d 删除空目录 -f 强制删除 -r 递归删除目录 -i 删除前提示 s...

  • Python删除文件及目录

    import osimport shutil 删除文件删除单个文件 删除目录删除单个目录(必须是空目录) 递归删除...

  • 封装 MySQL(四)封装 delete—— deleteMod

    接上。。。 删除语句 从需求来说,删除分为物理删除和逻辑删除,这里的删除指通过主键ID,物理删除记录 这个简单粗暴...

  • Kubernetes pv无法删除问题

    正常删除pvc,pv等的步骤 正确删除pv的步骤是删除使用pvc的pod,再删除pvc,最后删除pv pv无法删除...

  • linux sed 命令

    删除第一行 范围删除,删除1-3行 删除第n行 删除最后一行

  • neo4j-delete语法

    删除节点、关系或路径 删除单个节点 删除所有节点和关系 删除节点和它的关系 只删除关系

网友评论

      本文标题:gorm-V2-07-删除

      本文链接:https://www.haomeiwen.com/subject/wihqlrtx.html