zoukankan      html  css  js  c++  java
  • GORM模型删除

    GORM模型删除

    一、删除记录

    package main
    
    import (
    	"fmt"
    	"gorm.io/driver/mysql"
    	"gorm.io/gorm"
    )
    
    type UsersUpdate struct {
    	gorm.Model
    	//Name *string `gorm:"type:varchar(100);default:RandySun;comment:姓名"`
    	Name string `gorm:"type:varchar(100);default:RandySun;comment:姓名"`
    	Age  int64
    	// 设置默认值
    	Active bool
    }
    
    func main() {
    	dsn := "root:@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
    	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    	if err != nil {
    		panic(err)
    	}
    	// 迁移表创建对应关系
    	db.AutoMigrate(&UsersUpdate{})
    
    	// 添加数据
    	db.Debug().Create(&UsersUpdate{Name: "bary", Age: 18})
    	db.Debug().Create(&UsersUpdate{Name: "RandySun", Age: 18})
    	db.Debug().Create(&UsersUpdate{Name: "Jack", Age: 18})
    	db.Debug().Create(&UsersUpdate{Name: "", Age: 19}) // 添加记录name默认为Null
    	
    	//// 查询
    	var user UsersUpdate
    	db.Debug().First(&user)
    	fmt.Printf("%#v", user)
    
    }
    
    

    警告 删除记录时,请确保主键字段有值,GORM 会通过主键去删除记录,如果主键为空,GORM 会删除该 model 的所有记录

    var user UsersUpdate
    db.Debug().First(&user)
    fmt.Printf("%#v", user)
    // 删除现有记录
    //  UPDATE `users_updates` SET `deleted_at`='2021-11-24 09:07:51.079' WHERE `users_updates`.`id` = 1 AND `users_updates`.`deleted_at` IS NULL
    db.Debug().Delete(&user)
    
    // 为删除 SQL 添加额外的 SQL 操作
    // DELETE from emails where id=10 OPTION (OPTIMIZE FOR UNKNOWN);
    db.Set("gorm:delete_option", "OPTION (OPTIMIZE FOR UNKNOWN)").Delete(&email)
    
    

    image-20211124090900773

    image-20211124090841274

    二、批量删除

    删除全部匹配的记录

    var user UsersUpdate
    db.Debug().First(&user)
    fmt.Printf("%#v", user)
    //  UPDATE `users_updates` SET `deleted_at`='2021-11-24 22:10:16.311' WHERE name LIKE '%he%' AND `users_updates`.`id` = 1 AND `users_updates`.
    `deleted_at` IS NULL
    db.Debug().Where("name LIKE ?", "%he%").Delete(&user)
    
    // DELETE from `users_updates` where name LIKE "%Randy%";
    db.Debug().Delete(UsersUpdate{}, "name LIKE ?", "%Randy%")
    
    

    image-20211124221317481

    image-20211124221353978

    三、软删除

    如果一个 model 有 DeletedAt 字段,他将自动获得软删除的功能! 当调用 Delete 方法时, 记录不会真正的从数据库中被删除, 只会将DeletedAt 字段的值会被设置为当前时间

    // UPDATE users SET deleted_at="2013-10-29 10:23" WHERE id = 111;
    db.Delete(&user)
    
    
    // 批量删除
    // UPDATE users SET deleted_at="2013-10-29 10:23" WHERE age = 20;
    db.Where("age = ?", 20).Delete(&User{})
    
    
    // 查询记录时会忽略被软删除的记录
    // SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;
    db.Where("age = 20").Find(&user)
    
    
    // Unscoped 方法可以查询被软删除的记录
    // SELECT * FROM users WHERE age = 20;
    db.Unscoped().Where("age = 20").Find(&users)
    
    

    四、物理删除

    // Unscoped 方法可以物理删除记录
    //// DELETE FROM orders WHERE id=10;
    db.Unscoped().Delete(&order)
    
    

    image-20211124222604204

    image-20211124222618833

    image-20211124233716660

    image-20211124233731988

    image-20211124233850520

    image-20211124234702696

    image-20211124234717764

    image-20211124234728419

    image-20211124234850165

    image-20211125085448301

    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    gdb高级技巧
    Fira Code字体安装与配置
    回归
    【Luogu】P2292 [HNOI2004]L语言 题解
    浅谈Linux桌面(发行版及桌面环境)
    剑指offer-和为S的连续正数序列-知识迁移能力-python
    剑指offer-数组中只出现一次的数字-数组-python
    剑指offer-数字在排序数组中出现的次数-数组-python
    剑指offer-数组中的逆序对-数组-python
    剑指offer-丑数-穷举-python
  • 原文地址:https://www.cnblogs.com/randysun/p/15626814.html
Copyright © 2011-2022 走看看