• 删除数据Delete方法,参数为struct的指针并且成为查询条件。注意:当删除时,如果user中包含有bool,float64或者float32类型,有可能会使删除失败
package main

import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/go-xorm/xorm"
"log"
) var engine *xorm.Engine type User struct {
Name string `xorm:"varchar(25) 'name'"`
Id int `xorm:"pk 'id' autoincr"`
} func main() {
var err error
engine, err = xorm.NewEngine("mysql", "root:123456@/test")
if err != nil {
log.Fatal(err)
return
}
//创建表和插入数据
/*err = engine.CreateTables(User{})
if err != nil {
log.Fatal(err)
return
} u := make([]User, 3)
u[0].Name = "u0"
u[1].Name = "u1"
u[2].Name = "u2" _, err = engine.Insert(u)
if err != nil {
log.Fatal(err)
return
}*/ uu := new(User)
has ,err :=engine.Id(2).Get(uu)
if err !=nil {
log.Fatal(err)
return
}
if has {
fmt.Println("删除Deleted,用户名:",uu.Name)
}else {
fmt.Println("该数据现在已经不存在")
} affected, err := engine.Id(2).Delete(uu)
if err != nil {
log.Fatal(err)
return
}
fmt.Println("删除Delete,受影响的行数:", affected)
fmt.Println() has ,err =engine.Id(2).Get(uu)
if err !=nil {
log.Fatal(err)
return
}
if has {
fmt.Println("删除Deleted,用户名:",uu.Name,"deleteAt:")
}else {
fmt.Println("该数据现在已经不存在")
} affected, err = engine.Id(2).Delete(uu)
if err != nil {
log.Fatal(err)
return
}
fmt.Println("删除Delete,受影响的行数:", affected)
fmt.Println() /*
输出:
删除Deleted,用户名: u1
删除Delete,受影响的行数: 1 该数据现在已经不存在
删除Delete,受影响的行数: 0
*/ }
  • 软删除Deleted, Deleted可以让您不真正的删除数据,而是标记一个删除时间。使用此特性需要在xorm标记中使用deleted标记,对应的字段必须为time.Time类型。在Delete()时,deleted标记的字段将会被自动更新为当前时间而不是去删除该条记录

    package main
    
    import (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/go-xorm/xorm"
    "log"
    "time"
    ) var engine *xorm.Engine type User struct {
    Name string `xorm:"varchar(25) 'name'"`
    Id int `xorm:"pk 'id' autoincr"`
    Version int `xorm:"version"`
    UpdatedAt time.Time `xorm:"updated"`
    DeletedAt time.Time `xorm:"deleted"`
    } func main() {
    var err error
    engine, err = xorm.NewEngine("mysql", "root:123456@/test")
    if err != nil {
    log.Fatal(err)
    return
    }
    //创建表和插入数据
    /* err = engine.CreateTables(User{})
    if err != nil {
    log.Fatal(err)
    return
    } u := make([]User, 3)
    u[0].Name = "u0"
    u[1].Name = "u1"
    u[2].Name = "u2" _, err = engine.Insert(u)
    if err != nil {
    log.Fatal(err)
    return
    }*/ uu := new(User)
    has ,err :=engine.Id(2).Get(uu)
    if err !=nil {
    log.Fatal(err)
    return
    }
    if has {
    fmt.Println("软删除Deleted,用户名:",uu.Name,"deleteAt:",uu.DeletedAt)
    }else {
    fmt.Println("该数据现在已经不存在")
    } affected, err := engine.Id(2).Delete(uu)
    if err != nil {
    log.Fatal(err)
    return
    }
    fmt.Println("软删除Delete,受影响的行数:", affected)
    fmt.Println() has ,err =engine.Id(2).Get(uu)
    if err !=nil {
    log.Fatal(err)
    return
    }
    if has {
    fmt.Println("软删除Deleted,用户名:",uu.Name,"deleteAt:",uu.DeletedAt)
    }else {
    fmt.Println("该数据现在已经不存在")
    } affected, err = engine.Id(2).Delete(uu)
    if err != nil {
    log.Fatal(err)
    return
    }
    fmt.Println("软删除Delete,受影响的行数:", affected)
    fmt.Println() //那么如果记录已经被标记为删除后,要真正的获得该条记录或者真正的删除该条记录,需要启用Unscoped,如下所示:
    // 此时将可以获得记录,此时将可以真正的删除记录 has ,err =engine.Id(2).Unscoped().Get(uu)
    if err !=nil {
    log.Fatal(err)
    return
    }
    if has {
    fmt.Println("启用Unscoped,用户名:",uu.Name,"deleteAt:",uu.DeletedAt)
    }else {
    fmt.Println("该数据现在已经不存在")
    } affected, err = engine.Id(2).Unscoped().Delete(uu)
    if err != nil {
    log.Fatal(err)
    return
    }
    fmt.Println("启用Unscoped,受影响的行数:", affected) /*
    输出:
    软删除Deleted,用户名: u1 deleteAt: 0001-01-01 00:00:00 +0000 UTC
    软删除Deleted,受影响的行数: 1 该数据现在已经不存在
    软删除Deleted,受影响的行数: 0 启用Unscoped,用户名: u1 deleteAt: 2019-05-28 15:12:38 +0800 CST
    启用Unscoped,受影响的行数: 1
    */ }

xorm-删除和软删除实例的更多相关文章

  1. 深入理解 EF Core:使用查询过滤器实现数据软删除

    原文:https://bit.ly/2Cy3J5f 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能会去除一些本人实在不知道如何组织 ...

  2. tp5 model 中的软删除

    model中需use traits\model\SoftDelete; // 数据表中需添加一个 delete_time 字段保存删除时间 namespace app\index\model; use ...

  3. Laravel5.1 模型 --软删除

    软删除是比较实用的一种删除手段,比如说 你有一本账 有一笔记录你觉得不对给删了 过了几天发现不应该删除,这时候软删除的目的就实现了 你可以找到已经被删除的数据进行操作 可以是还原也可以是真正的删除. ...

  4. laravel框架总结(九) -- 软删除

    当模型被软删除时,它们并不会真的从数据库中被移除.而是会在模型上设置一个 deleted_at 属性并将其添加到数据库.如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空. ...

  5. laravel5.2总结--软删除

    当模型被软删除时,它们并不会真的从数据库中被移除.而是会在模型上设置一个 deleted_at 属性并将其添加到数据库.如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空. ...

  6. 在FreeSQL中实现「触发器」和软删除功能

    前言 最近做新项目,技术栈 AspNetCore + FreeSQL 这个ORM真的好用,文档也很完善,这里记录一下两个有关「触发器」的功能实现 修改实体时记录更新时间 模型代码 我的模型都是基于这个 ...

  7. 软删除脏数据job笔记

    某次处理一个case,发现线上库里有很多数据有问题.于是决定写一个job来将有问题的数据软删除掉.涉及到的两条SQL语句如下: <select id="loadTSKTVBillDai ...

  8. 关于Domino数据库的软删除

    在Domino的数据库属性的 “高级” 附签(选择文件->数据库->属性),选中“允许软删除”,这样我们就启用了软删除功能,当一个文档没有删除的时候我们可以使用NotesDatabase的 ...

  9. Mysql软删除

    所谓软删除(Soft Deleting),即在删除数据表中的数据时,并不直接将其从数据表中删除,而是将其标志为删除,即在每张表中设置一个删除字段(如:IsDeleted)等,默认情况下其值为0,及未删 ...

随机推荐

  1. Redis 迁移 DB; move key db

    redis 移动 DB MOVE key db将当前数据库的 key 移动到给定的数据库 db 当中.如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存 ...

  2. 3-开发共享版APP(搭建指南)-修改手机验证码

    https://www.cnblogs.com/yangfengwu/p/11273743.html 请先看数据篇 或者参考 https://www.cnblogs.com/yangfengwu/p/ ...

  3. [RN] React Native 滚动跳转到指定位置

    React Native 滚动跳转到指定位置 一.结构 <ScrollView horizontal={true} ref={(view) => { this.myScrollView = ...

  4. SQL基础-游标&事务

    一.游标 1.游标简介 SQL是一种集合操作语言,但有时候需要对单行操作怎么办呢? 也就是有时候会过滤出不止一行的数据,但是想一行行的处理: ---游标 游标: 从集合中依次提取单条记录,直接提取完最 ...

  5. SpringMVC效验器

    效验器: 1. 效验器依赖 <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator --> &l ...

  6. http请求的header的一个小细节

    今天前后端联调的时候无论如何后端都搜不到前端的token,以为是公司全局网关拦截了token,最后发现也不是,最终在无意之中发现http请求的header的key不能带有下划线,比如app_token ...

  7. Vue系列——动态设置img标签的src属性

    声明 本文转自:vue动态设置img的src路径 正文 相信开发的小伙伴已经遇到这个问题了,动态切换img标签的src时,写的路径就是不生效,原因是vue并没有把你的路径字符串当做路径来处理,而是直接 ...

  8. Metasploit使用内网跳板, 扫描局域网主机

    最近,拿到一台内网机器, 苦于无法使用nmap扫描改主机的内网, 所以才有此文 在跳板机子获取一定权限后,需要积极的向内网主机权限发展,获取指定的目标信息,探查系统漏洞,借助msf已经得到的meter ...

  9. 爬虫中Selenium和PhantomJS

    Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上, ...

  10. ubuntu16.04下安装运行PL-SLAM

    PL-SLAM是Ruben Gomez-Ojeda大神融合点和线特征SLAM的最新成果,并开放了源代码,本博文记录安装运行PL-SLAM遇到的一些问题. 1源代码地址 https://github.c ...