|
|
|
|
package gormExample
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"gorm.io/gorm"
|
|
|
|
|
"log"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func SessionIssue() {
|
|
|
|
|
// 连续控制条件
|
|
|
|
|
//db := DB.Model(&Content{}).Where("views > ?", 100)
|
|
|
|
|
//db.Where("likes > ?", 9)
|
|
|
|
|
//var cs []Content
|
|
|
|
|
//db.Find(&cs)
|
|
|
|
|
// [4.319ms] [rows:0] SELECT * FROM `msb_content` WHERE views > 100 AND likes > 9 AND `msb_content`.`deleted_at` IS NULL
|
|
|
|
|
|
|
|
|
|
// 连续执行查询
|
|
|
|
|
// 1
|
|
|
|
|
// Where("views > ?", 100).Where("likes > ?", 9)
|
|
|
|
|
db := DB.Model(&Content{}).Where("views > ?", 100)
|
|
|
|
|
|
|
|
|
|
db.Where("likes > ?", 9)
|
|
|
|
|
var cs1 []Content
|
|
|
|
|
db.Find(&cs1)
|
|
|
|
|
// [10.566ms] [rows:0] SELECT * FROM `msb_content` WHERE views > 100 AND likes > 9 AND `msb_content`.`deleted_at` IS NULL
|
|
|
|
|
|
|
|
|
|
// 2,找到likes<5
|
|
|
|
|
// Where("views > ?", 100).Where("likes < ?", 5)
|
|
|
|
|
db.Where("likes < ?", 5)
|
|
|
|
|
var cs2 []Content
|
|
|
|
|
db.Find(&cs2)
|
|
|
|
|
// [2.815ms] [rows:0] SELECT * FROM `msb_content` WHERE views > 100 AND likes > 9 AND `msb_content`.`deleted_at` IS NULL AND likes < 5
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func SessionDB() {
|
|
|
|
|
// 连续执行查询
|
|
|
|
|
// 1
|
|
|
|
|
// Where("views > ?", 100).Where("likes > ?", 9)
|
|
|
|
|
db1 := DB.Model(&Content{}).Where("views > ?", 100)
|
|
|
|
|
db1.Where("likes > ?", 9)
|
|
|
|
|
var cs1 []Content
|
|
|
|
|
db1.Find(&cs1)
|
|
|
|
|
// [10.683ms] [rows:0] SELECT * FROM `msb_content` WHERE views > 100 AND likes > 9 AND `msb_content`.`deleted_at` IS NULL
|
|
|
|
|
|
|
|
|
|
// 2,找到likes<5
|
|
|
|
|
// Where("views > ?", 100).Where("likes < ?", 5)
|
|
|
|
|
db2 := DB.Model(&Content{}).Where("views > ?", 100)
|
|
|
|
|
db2.Where("likes < ?", 5)
|
|
|
|
|
var cs2 []Content
|
|
|
|
|
db2.Find(&cs2)
|
|
|
|
|
// [4.139ms] [rows:0] SELECT * FROM `msb_content` WHERE views > 100 AND likes < 5 AND `msb_content`.`deleted_at` IS NULL
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func SessionNew() {
|
|
|
|
|
|
|
|
|
|
// 需要重复使用的部分
|
|
|
|
|
// 将Session方法前的配置,记录到了当前的会话中
|
|
|
|
|
// 后边再次调用db的方法直到终结方法,会保持会话中的子句选项
|
|
|
|
|
// 执行完终结方法后,再次调用db的方法到终结方法,可以重用会话中的子句选项。
|
|
|
|
|
db := DB.Model(&Content{}).Where("views > ?", 100).Session(&gorm.Session{})
|
|
|
|
|
|
|
|
|
|
// 连续执行查询
|
|
|
|
|
// 1
|
|
|
|
|
// Where("views > ?", 100).Where("likes > ?", 9)
|
|
|
|
|
var cs1 []Content
|
|
|
|
|
db.Where("likes > ?", 9).Find(&cs1)
|
|
|
|
|
// [4.633ms] [rows:0] SELECT * FROM `msb_content` WHERE views > 100 AND likes > 9 AND `msb_content`.`deleted_at` IS NULL
|
|
|
|
|
|
|
|
|
|
// 2,找到likes<5
|
|
|
|
|
// Where("views > ?", 100).Where("likes < ?", 5)
|
|
|
|
|
var cs2 []Content
|
|
|
|
|
db.Where("likes < ?", 5).Find(&cs2)
|
|
|
|
|
// [3.846ms] [rows:0] SELECT * FROM `msb_content` WHERE views > 100 AND likes < 5 AND `msb_content`.`deleted_at` IS NULL
|
|
|
|
|
}
|
|
|
|
|
func SessionOptions() {
|
|
|
|
|
// Skip Hook
|
|
|
|
|
//db := DB.Session(&gorm.Session{
|
|
|
|
|
// SkipHooks: true,
|
|
|
|
|
//})
|
|
|
|
|
//db.Save(&Content{Subject: "no create hook"})
|
|
|
|
|
|
|
|
|
|
// DryRun
|
|
|
|
|
//db := DB.Session(&gorm.Session{
|
|
|
|
|
// DryRun: true,
|
|
|
|
|
//})
|
|
|
|
|
//stmt := db.Save(&Content{}).Statement
|
|
|
|
|
//fmt.Println(stmt.SQL.String())
|
|
|
|
|
//// INSERT INTO `msb_content` (`created_at`,`updated_at`,`deleted_at`,`subject`,`likes`,`views`,`publish_time`,`author_id`) VALUES (?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE `updated_at`=?,`deleted_at`=VALUES(`deleted_at`),`subject`=VALUES(`subject`),`likes`=VALUES(`likes`),`views`=VALUES(`views`),`publish_time`=VALUES(`publish_time`),`author_id`=VALUES(`author_id`)
|
|
|
|
|
//fmt.Println(stmt.Vars)
|
|
|
|
|
//// [2023-04-24 17:25:47.827 +0800 CST 2023-04-24 17:25:47.827 +0800 CST {0001-01-01 00:00:00 +0000 UTC false} 0 0 2023-04-24 17:25:47.823908 +0800 CST 0 2023-04-24 17:25:47.827 +0800 CST]
|
|
|
|
|
|
|
|
|
|
// Debug
|
|
|
|
|
//DB.Debug().First()
|
|
|
|
|
|
|
|
|
|
// prepare 预编译,编译重用,编译独立
|
|
|
|
|
// SQL, 编译,绑定数据,执行
|
|
|
|
|
// 预编译,将编译的过程缓存起来,便于重用。
|
|
|
|
|
// 在执行结构相同的SQL时,可以重用。
|
|
|
|
|
db := DB.Session(&gorm.Session{
|
|
|
|
|
PrepareStmt: true,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 预编译管理对象
|
|
|
|
|
stmtManager, ok := db.ConnPool.(*gorm.PreparedStmtDB)
|
|
|
|
|
if !ok {
|
|
|
|
|
log.Fatalln("*gorm.PreparedStmtDB assert failed")
|
|
|
|
|
}
|
|
|
|
|
fmt.Println(stmtManager.PreparedSQL)
|
|
|
|
|
fmt.Println(stmtManager.Stmts)
|
|
|
|
|
|
|
|
|
|
var c1 Content
|
|
|
|
|
db.First(&c1, 13)
|
|
|
|
|
fmt.Println(stmtManager.PreparedSQL)
|
|
|
|
|
fmt.Println(stmtManager.Stmts)
|
|
|
|
|
// [SELECT * FROM `msb_content` WHERE `msb_content`.`id` = ? AND `msb_content`.`deleted_at` IS NULL ORDER BY `msb_content`.`id` LIMIT 1]
|
|
|
|
|
// map[SELECT * FROM `msb_content` WHERE `msb_content`.`id` = ? AND `msb_content`.`deleted_at` IS NULL ORDER BY `msb_content`.`id` LIMIT 1:0xc0001cd920]
|
|
|
|
|
|
|
|
|
|
var c2 Content
|
|
|
|
|
db.First(&c2, 14)
|
|
|
|
|
fmt.Println(stmtManager.PreparedSQL)
|
|
|
|
|
fmt.Println(stmtManager.Stmts)
|
|
|
|
|
// [SELECT * FROM `msb_content` WHERE `msb_content`.`id` = ? AND `msb_content`.`deleted_at` IS NULL ORDER BY `msb_content`.`id` LIMIT 1]
|
|
|
|
|
// map[SELECT * FROM `msb_content` WHERE `msb_content`.`id` = ? AND `msb_content`.`deleted_at` IS NULL ORDER BY `msb_content`.`id` LIMIT 1:0xc0001cd920]
|
|
|
|
|
|
|
|
|
|
var c3 []Content
|
|
|
|
|
db.Find(&c3, []uint{15, 16})
|
|
|
|
|
fmt.Println(stmtManager.PreparedSQL)
|
|
|
|
|
fmt.Println(stmtManager.Stmts)
|
|
|
|
|
// [SELECT * FROM `msb_content` WHERE `msb_content`.`id` = ? AND `msb_content`.`deleted_at` IS NULL ORDER BY `msb_content`.`id` LIMIT 1 SELECT * FROM `msb_content` WHERE `msb_content`.`id` IN (?,?) AND `msb_content`.`deleted_at` IS NULL]
|
|
|
|
|
// map[SELECT * FROM `msb_content` WHERE `msb_content`.`id` = ? AND `msb_content`.`deleted_at` IS NULL ORDER BY `msb_content`.`id` LIMIT 1:0xc0001cb920 SELECT * FROM `msb_content` WHERE `msb_content`.`id` IN (?,?) AND `msb_content`.`deleted_at` IS NULL:0xc0001cbe30]
|
|
|
|
|
|
|
|
|
|
}
|