当前位置: 首页 > news >正文

ShardingSphere-Proxy分表场景:go测试案例

接续上篇文章《ShardingSphere-Proxy分表场景测试案例》

go测试用例:

package mainimport ("fmt""math/rand""time""github.com/bwmarrin/snowflake""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger"
)var globalDB *gorm.DBtype Order struct {ID        int64  `gorm:"primaryKey"`OrderId   string `gorm:"sharding:order_id"` // 指明 OrderId 是分片键UserID    int64  `gorm:"sharding:user_id"`ProductID int64OrderDate int64
}type Product struct {ID   int64  `gorm:"primaryKey"`Name string `gorm:"name"`
}// 定义结构体,用于接收查询结果
type OrderGroup struct {ID         int64  `gorm:"primaryKey"`OrderId    string `gorm:"sharding:order_id"` // 指明 OrderId 是分片键UserID     int64  `gorm:"sharding:user_id"`ProductID  int64OrderDate  int64SumProduct int64MaxProduct int64
}type OrderProduct struct {OrderProduct
}type User struct {ID   int64  `gorm:"primaryKey"`Name string `gorm:"name"`
}type OrderUser struct {OrderUser
}func main() {InitDb()// 示例:插入订单数据InsertRandomOrders()// 示例:插入product数据InsertRandomProducts()// 示例:插入user数据InsertRandomUsers()// 场景1:全表查询,不含分表键FindAllOrders()// 场景2:根据订单号查询订单,不含分表健FindOrderByOrderId("20240101ORDER9503")// 场景3:根据用户ID查询订单,含分表健FindOrderByUserID(8648)// 场景4:等值查询,根据订单id和product_id查询订单。不包含分表健FindOrderByOrderIdAndProductID("20240101ORDER6546", 861)// 场景5:等值查询,根据用户id和product_id查询订单。包含分表健FindOrderByUserIDAndProductID(4581, 213)// 场景6:in查询,根据用户id查询订单。包含分表健FindOrderByUserIDIn([]int64{2608, 4581, 2142, 3519})// 场景7:in查询,根据order_id查询订单。不包含分表健FindOrderByOrderIdIn([]string{"20240101ORDER6546", "20250101ORDER2295", "20250101ORDER4465", "20240101ORDER7826"})// 场景8:between查询,根据order_id查询订单。不包含分表健FindOrderByOrderIdBetween("20240101ORDER6546", "20240101ORDER6548")// 场景9:beteeen查询,根据user_id查询订单。包含分表健FindOrderByUserIDBetween(4581, 4583)// 场景10:or查询,根据order_id查询订单。不包含分表健FindOrderByOrderIdOr("20240101ORDER6546", "20250101ORDER2295")// 场景11:or查询,根据user_id查询订单。包含分表健FindOrderByUserIDOr(4581, 3519)// 场景12:>查询,根据order_id查询订单。不包含分表健FindOrderByOrderIdGt("20240101ORDER6546")// 场景13:>查询,根据user_id查询订单。包含分表健FindOrderByUserIDGt(4581)// 场景14:累加聚合查询,根据order_id查询订单。不包含分表健FindOrderByOrderIdSum("20240101ORDER6546")// 场景15:累加聚合查询,根据user_id查询订单。包含分表健FindOrderByUserIDSum(4581)// 场景16:count查询,根据order_id查询订单。不包含分表健FindOrderByOrderIdCount("20240101ORDER6546")// 场景17:count查询,根据user_id查询订单。包含分表健FindOrderByUserIDCount(4581)// 场景18:count查询,全表查询。不包含分表健FindAllOrdersCount()// 场景19:sum查询,全表查询。不包含分表健FindAllOrdersSum()// 场景20:比较聚合查询,max查询,全表查询。不包含分表健FindAllOrdersMax()// 场景21:比较聚合查询,min查询,全表查询。不包含分表健FindAllOrdersMin()// 场景22:平均聚合查询,全表查询。不包含分表健FindAllOrdersAvg()// 场景23:分组聚合查询,根据order_id分组查询。不包含分表健FindOrderByOrderIdGroupBy()// 场景24:分组聚合查询,根据user_id分组查询。包含分表健FindOrderByUserIDGroupBy()// 场景25:排序、分页查询,根据order_id排序,查询第2页数据。不包含分表健FindOrderByOrderIdOrderPage(1, 5)// 场景26:排序、分页查询,根据user_id排序,查询第2页数据。包含分表健FindOrderByUserIDOrderPage(1, 5)// 场景27:去重查询,根据order_id去重,查询订单。不包含分表健FindOrderByOrderIdDistinct()// 场景28:去重查询,根据user_id去重,查询订单。包含分表健FindOrderByUserIDDistinct()// 场景29:join查询,order表和product表关联查询。join条件不包含分表健FindOrderJoinProduct()// 场景30:join查询,order表和user表关联查询。join条件包含分表健FindOrderJoinUser()// 场景31:子查询,order表和product表关联查询作为子查询,查询订单。join条件不包含分表健FindOrderSubQueryProduct()// 场景32:子查询,order表和user表关联查询作为子查询,查询订单。join条件包含分表健FindOrderSubQueryUser()// 场景33:where in 子查询表FindOrderInSubQuery()// 场景34:union查询。包含分表健FindOrderUnion()// 场景35:union all查询。包含分表健FindOrderUnionAll()// 场景36:union 查询。不包含分表健FindOrderUnionByOrderId()// 场景37:union all查询。不包含分表健FindOrderUnionAllByOrderId()// 场景38:根据主键更新UpdateOrderByID(1866023311733952512, 1)// 场景39:场景39:根据分表键更新UpdateOrderByUserID(9148, 1)// 场景40:根据主键删除DeleteOrderByID(1866023311071252480)// 场景41:根据分表键删除DeleteOrderByUserID(4389)
}// 生成product数据插入
func InsertRandomProducts() {// 查询所有订单var orders []Ordererr := globalDB.Table("orders").Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return}// 生成product数据for _, order := range orders {product := Product{ID:   order.ProductID,Name: fmt.Sprintf("product_%04d", order.ProductID),}InsertProduct(product)}
}// 插入product数据
func InsertProduct(product Product) error {err := globalDB.Table("product").Create(&product).Errorif err != nil {fmt.Println("Error creating product:", err)}return nil
}// 生成user数据插入
func InsertRandomUsers() {// 查询所有订单var orders []Ordererr := globalDB.Table("orders").Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return}// 生成user数据for _, order := range orders {user := User{ID:   order.UserID,Name: fmt.Sprintf("user_%04d", order.UserID),}InsertUser(user)}
}// 插入user数据
func InsertUser(user User) error {err := globalDB.Table("user").Create(&user).Errorif err != nil {fmt.Println("Error creating user:", err)}return nil
}// 随机生成一些订单数据插入
func InsertRandomOrders() {node, err := snowflake.NewNode(1)if err != nil {fmt.Println("Error creating snowflake node:", err)return}now := time.Now()for i := 0; i < 10; i++ {// 雪花id生成// 生成一个IDid := node.Generate()order := Order{ID:        id.Int64(),OrderId:   fmt.Sprintf("20240101ORDER%04d", rand.Int31n(10000)),UserID:    int64(rand.Int31n(10000)),ProductID: int64(rand.Int31n(1000)),OrderDate: now.Unix(),}InsertOrder(order)}// orderDate 用2025年,拼接当前月,日,时,分秒orderDate := time.Date(2025, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.UTC)for i := 0; i < 10; i++ {id := node.Generate()order := Order{ID:        id.Int64(),OrderId:   fmt.Sprintf("20250101ORDER%04d", rand.Int31n(10000)),UserID:    int64(rand.Int31n(10000)),ProductID: int64(rand.Int31n(1000)),OrderDate: orderDate.Unix(),}InsertOrder(order)}
}// 插入订单数据
func InsertOrder(order Order) error {err := globalDB.Create(&order).Errorif err != nil {fmt.Println("Error creating order:", err)}return nil
}// 场景1:全表查询,不含分表键
func FindAllOrders() ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景1:全表查询,不含分表键 orders:", orders)return orders, err
}// 场景2:根据订单号查询订单,不含分表健
func FindOrderByOrderId(orderId string) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Where("order_id=?", orderId).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景2:根据订单号查询订单,不含分表健 orders:", orders)return orders, err
}// 场景3:根据用户ID查询订单,含分表健
func FindOrderByUserID(userID int64) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Where("user_id=?", userID).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景3:根据用户ID查询订单,含分表健 orders:", orders)return orders, err
}// 场景4:等值查询,根据订单id和product_id查询订单。不包含分表健
func FindOrderByOrderIdAndProductID(orderId string, productID int64) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Where("order_id=? AND product_id=?", orderId, productID).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景4:等值查询,根据订单id和product_id查询订单 orders:", orders)return orders, err
}// 场景5:等值查询,根据用户id和product_id查询订单。包含分表健
func FindOrderByUserIDAndProductID(userID int64, productID int64) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Where("user_id=? AND product_id=?", userID, productID).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景5:等值查询,根据用户id和product_id查询订单 orders:", orders)return orders, err
}// 场景6:in查询,根据用户id查询订单。包含分表健
func FindOrderByUserIDIn(userIDs []int64) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Where("user_id IN ?", userIDs).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景6:in查询,根据用户id查询订单 orders:", orders)return orders, err
}// 场景7:in查询,根据order_id查询订单。不包含分表健
func FindOrderByOrderIdIn(orderIDs []string) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Where("order_id IN ?", orderIDs).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景7:in查询,根据order_id查询订单 orders:", orders)return orders, err
}// 场景8:between查询,根据order_id查询订单。不包含分表健
func FindOrderByOrderIdBetween(orderID1, orderID2 string) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Where("order_id BETWEEN ? AND ?", orderID1, orderID2).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景8:between查询,根据order_id查询订单 orders:", orders)return orders, err
}// 场景9:beteeen查询,根据user_id查询订单。包含分表健
// 包含分表健的between查询,似乎不支持。allow-range-query-with-inline-sharding设置为true,可以支持,这个场景待重新测试。
func FindOrderByUserIDBetween(userID1, userID2 int64) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Where("user_id BETWEEN ? AND ?", userID1, userID2).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景9:beteeen查询,根据user_id查询订单 orders:", orders)return orders, err
}// 场景10:or查询,根据order_id查询订单。不包含分表健
func FindOrderByOrderIdOr(orderID1, orderID2 string) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Where("order_id = ? OR order_id = ?", orderID1, orderID2).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景10:or查询,根据order_id查询订单 orders:", orders)return orders, err
}// 场景11:or查询,根据user_id查询订单。包含分表健
func FindOrderByUserIDOr(userID1, userID2 int64) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Where("user_id = ? OR user_id = ?", userID1, userID2).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景11:or查询,根据user_id查询订单 orders:", orders)return orders, err
}// 场景12:>查询,根据order_id查询订单。不包含分表健
func FindOrderByOrderIdGt(orderID string) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Where("order_id > ?", orderID).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景12:>查询,根据order_id查询订单 orders:", orders)return orders, err
}// 场景13:>查询,根据user_id查询订单。包含分表健
// 包含分表键的>查询,似乎不支持。allow-range-query-with-inline-sharding设置为true,可以支持,这个场景待重新测试。
func FindOrderByUserIDGt(userID int64) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Where("user_id > ?", userID).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景13:>查询,根据user_id查询订单 orders:", orders)return orders, err
}// 场景14:累加聚合查询,根据order_id查询订单。不包含分表健
func FindOrderByOrderIdSum(orderID string) (int64, error) {var sum int64err := globalDB.Table("orders").Where("order_id=?", orderID).Select("SUM(product_id)").Scan(&sum).Errorif err != nil {fmt.Println("Error finding orders:", err)return 0, err}fmt.Println("场景14:累加聚合查询,根据order_id查询订单 orders:", sum)return sum, err
}// 场景15:累加聚合查询,根据user_id查询订单。包含分表健
func FindOrderByUserIDSum(userID int64) (int64, error) {var sum int64err := globalDB.Table("orders").Where("user_id=?", userID).Select("SUM(product_id)").Scan(&sum).Errorif err != nil {fmt.Println("Error finding orders:", err)return 0, err}fmt.Println("场景15:累加聚合查询,根据user_id查询订单 orders:", sum)return sum, err
}// 场景16:count查询,根据order_id查询订单。不包含分表健
func FindOrderByOrderIdCount(orderID string) (int64, error) {var count int64err := globalDB.Table("orders").Where("order_id=?", orderID).Count(&count).Errorif err != nil {fmt.Println("Error finding orders:", err)return 0, err}fmt.Println("场景16:count查询,根据order_id查询订单 orders:", count)return count, err
}// 场景17:count查询,根据user_id查询订单。包含分表健
func FindOrderByUserIDCount(userID int64) (int64, error) {var count int64err := globalDB.Table("orders").Where("user_id=?", userID).Count(&count).Errorif err != nil {fmt.Println("Error finding orders:", err)return 0, err}fmt.Println("场景17:count查询,根据user_id查询订单 orders:", count)return count, err
}// 场景18:count查询,全表查询。不包含分表健
func FindAllOrdersCount() (int64, error) {var count int64err := globalDB.Table("orders").Count(&count).Errorif err != nil {fmt.Println("Error finding orders:", err)return 0, err}fmt.Println("场景18:count查询,全表查询 orders:", count)return count, err
}// 场景19:sum查询,全表查询。不包含分表健
func FindAllOrdersSum() (int64, error) {var sum int64err := globalDB.Table("orders").Select("SUM(product_id)").Scan(&sum).Errorif err != nil {fmt.Println("Error finding orders:", err)return 0, err}fmt.Println("场景19:sum查询,全表查询 orders:", sum)return sum, err
}// 场景20:比较聚合查询,max查询,全表查询。不包含分表健
func FindAllOrdersMax() (int64, error) {var max int64err := globalDB.Table("orders").Select("MAX(user_id)").Scan(&max).Errorif err != nil {fmt.Println("Error finding orders:", err)return 0, err}fmt.Println("场景20:max查询,全表查询 orders:", max)return max, err
}// 场景21:比较聚合查询,min查询,全表查询。不包含分表健
func FindAllOrdersMin() (int64, error) {var min int64err := globalDB.Table("orders").Select("MIN(user_id)").Scan(&min).Errorif err != nil {fmt.Println("Error finding orders:", err)return 0, err}fmt.Println("场景21:min查询,全表查询 orders:", min)return min, err
}// 场景22:平均聚合查询,全表查询。不包含分表健
func FindAllOrdersAvg() (float64, error) {var avg float64err := globalDB.Table("orders").Select("AVG(user_id)").Scan(&avg).Errorif err != nil {fmt.Println("Error finding orders:", err)return 0, err}fmt.Println("场景22:avg查询,全表查询 orders:", avg)return avg, err
}// 场景23:分组聚合查询,根据order_id分组查询。不包含分表健
func FindOrderByOrderIdGroupBy() error {var orders []OrderGrouperr := globalDB.Table("orders").Group("order_id").Select("*,SUM(product_id) AS sum_product,MAX(product_id) as max_product").Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return err}fmt.Printf("场景23:分组聚合查询,根据order_id分组查询 orders:%+v\n", orders)return err
}// 场景24:分组聚合查询,根据user_id分组查询。包含分表健
func FindOrderByUserIDGroupBy() error {var orders []OrderGrouperr := globalDB.Table("orders").Group("user_id").Select("*,SUM(product_id) AS sum_product,MAX(product_id) as max_product").Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return err}fmt.Printf("场景24:分组聚合查询,根据user_id分组查询 orders:%+v\n", orders)return err
}// 场景25:排序、分页查询,根据order_id排序,查询第2页数据。不包含分表健
func FindOrderByOrderIdOrderPage(page, pageSize int) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Order("order_id desc").Offset((page - 1) * pageSize).Limit(pageSize).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景25:排序、分页查询,根据order_id排序,查询第2页数据 orders:", orders)return orders, err
}// 场景26:排序、分页查询,根据user_id排序,查询第2页数据。包含分表健
func FindOrderByUserIDOrderPage(page, pageSize int) ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Order("user_id desc").Offset((page - 1) * pageSize).Limit(pageSize).Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景26:排序、分页查询,根据user_id排序,查询第2页数据 orders:", orders)return orders, err
}// 场景27:去重查询,根据order_id去重,查询订单。不包含分表健
func FindOrderByOrderIdDistinct() ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Distinct("order_id").Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景27:去重查询,根据order_id去重,查询订单 orders:", orders)return orders, err
}// 场景28:去重查询,根据user_id去重,查询订单。包含分表健
func FindOrderByUserIDDistinct() ([]Order, error) {var orders []Ordererr := globalDB.Table("orders").Distinct("user_id").Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景28:去重查询,根据user_id去重,查询订单 orders:", orders)return orders, err
}// 场景29:join查询,order表和product表关联查询。join条件不包含分表健
func FindOrderJoinProduct() ([]OrderProduct, error) {var orders []OrderProducterr := globalDB.Table("orders").Joins("JOIN product ON orders.product_id = product.id").Select("orders.*,product.*").Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景29:join查询,order表和product表关联查询 orders:", orders)return orders, err
}// 场景30:join查询,order表和user表关联查询。join条件包含分表健
func FindOrderJoinUser() ([]OrderUser, error) {var orders []OrderUsererr := globalDB.Table("orders").Joins("JOIN user ON orders.user_id = user.id").Select("orders.*,user.*").Find(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景30:join查询,order表和user表关联查询 orders:", orders)return orders, err
}// 场景31:子查询,order表和product表关联查询作为子查询,查询订单。join条件不包含分表健
func FindOrderSubQueryProduct() ([]OrderProduct, error) {var orders []OrderProductsql := `SELECT subquery.* FROM (SELECT orders.* FROM orders JOIN product ON orders.product_id = product.id) AS subquery`err := globalDB.Raw(sql).Scan(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景31:子查询,order表和product表关联查询作为子查询,查询订单 orders:", orders)return orders, err
}// 场景32:子查询,order表和user表关联查询作为子查询,查询订单。join条件包含分表健
func FindOrderSubQueryUser() ([]OrderUser, error) {var orders []OrderUsersql := `SELECT subquery.* FROM (SELECT orders.* FROM orders JOIN user ON orders.user_id = user.id) AS subquery`err := globalDB.Raw(sql).Scan(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景32:子查询,order表和user表关联查询作为子查询,查询订单 orders:", orders)return orders, err
}// 场景33:where in 子查询表
func FindOrderInSubQuery() ([]Order, error) {var orders []Ordersql := `SELECT * FROM orders WHERE user_id IN (SELECT id FROM user)`err := globalDB.Raw(sql).Scan(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景33:where in 子查询表 orders:", orders)return orders, err
}// 场景34:union查询。包含分表健
func FindOrderUnion() ([]Order, error) {var orders []Ordersql := `SELECT * FROM orders WHERE user_id = 8648 UNION SELECT * FROM orders WHERE user_id = 3401`err := globalDB.Raw(sql).Scan(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景34:union查询 orders:", orders)return orders, err
}// 场景35:union all查询。包含分表健
func FindOrderUnionAll() ([]Order, error) {var orders []Ordersql := `SELECT * FROM orders WHERE user_id = 8648 UNION ALL SELECT * FROM orders WHERE user_id = 3401`err := globalDB.Raw(sql).Scan(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景35:union all查询 orders:", orders)return orders, err
}// 场景36:union 查询。不包含分表健
func FindOrderUnionByOrderId() ([]Order, error) {var orders []Ordersql := `SELECT * FROM orders WHERE order_id = '20240101ORDER6546' UNION SELECT * FROM orders WHERE order_id = '20240101ORDER9728'`err := globalDB.Raw(sql).Scan(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景36:union查询 orders:", orders)return orders, err
}// 场景37:union all查询。不包含分表健
func FindOrderUnionAllByOrderId() ([]Order, error) {var orders []Ordersql := `SELECT * FROM orders WHERE order_id = '20240101ORDER6546' UNION ALL SELECT * FROM orders WHERE order_id = '20240101ORDER9728'`err := globalDB.Raw(sql).Scan(&orders).Errorif err != nil {fmt.Println("Error finding orders:", err)return nil, err}fmt.Println("场景37:union all查询 orders:", orders)return orders, err
}// 场景38:根据主键更新
func UpdateOrderByID(ID int64, productID int) error {err := globalDB.Table("orders").Where("id = ?", ID).Update("product_id", productID).Errorif err != nil {fmt.Println("Error updating orders:", err)}return err
}// 场景39:根据分表键更新
func UpdateOrderByUserID(userID int64, productID int) error {err := globalDB.Table("orders").Where("user_id = ?", userID).Update("product_id", productID).Errorif err != nil {fmt.Println("Error updating orders:", err)}return err
}// 场景40:根据主键删除
func DeleteOrderByID(ID int64) error {err := globalDB.Table("orders").Where("id = ?", ID).Delete(&Order{}).Errorif err != nil {fmt.Println("Error deleting orders:", err)}return err
}// 场景41:根据分表键删除
func DeleteOrderByUserID(userID int64) error {err := globalDB.Table("orders").Where("user_id = ?", userID).Delete(&Order{}).Errorif err != nil {fmt.Println("Error deleting orders:", err)}return err
}// InitDb 初始化数据库连接
func InitDb() *gorm.DB {log := logger.Default.LogMode(logger.Info)// 连接到 MySQL 数据库dsn := "sharding:sharding@tcp(localhost:13308)/sharding"db, err := gorm.Open(mysql.New(mysql.Config{DSN: dsn,}), &gorm.Config{Logger: log,})if err != nil {panic("failed to connect database")}globalDB = dbreturn db
}

相关文章:

ShardingSphere-Proxy分表场景:go测试案例

接续上篇文章《ShardingSphere-Proxy分表场景测试案例》 go测试用例&#xff1a; package mainimport ("fmt""math/rand""time""github.com/bwmarrin/snowflake""gorm.io/driver/mysql""gorm.io/gorm""gor…...

OpenStack系列第四篇:云平台基础功能与操作(Dashboard)

文章目录 1. 镜像&#xff08;Image&#xff09;添加镜像查看镜像删除镜像 2. 卷&#xff08;Volume&#xff09;创建卷查看卷删除卷 3. 网络&#xff08;虚拟网络&#xff09;创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对&#xff08…...

ESP32 I2S音频总线学习笔记(一):初识I2S通信与配置基础

文章目录 简介为什么需要I2S&#xff1f;关于音频信号采样率分辨率音频声道 怎样使用I2S传输音频&#xff1f;位时钟BCLK字时钟WS串行数据SD I2S传输模型I2S通信格式I2S格式左对齐格式右对齐格式 i2s基本配置i2s 底层API加载I2S驱动设置I2S使用的引脚I2S读取数据I2S发送数据卸载…...

25上半年软考高级系统分析师易混淆知识点

第1章 系统工程与信息系统基础 易混淆点1&#xff1a;系统工程生命周期与信息系统的生命周期 1、系统工程生命周期阶段 探索性研究→概念阶段→开发阶段→生产阶段→使用阶段→保障阶段→退役阶段 2、信息系统的生命周期 产生阶段→开发阶段&#xff08;单个系统开发&…...

采集JSON解析错误的修复

两段采集来的JSON格式&#xff1a; 一&#xff1a; {"hwgOnlineId":"554312", "jiwuChatId":"", "phoneCategoryId":"20006", "cuxiaoSeq":{voucherTitle:1,lh 二&#xff1a; {"pic":&q…...

Java中实现对象的深拷贝(Deep Copy)

在Java中实现对象的深拷贝&#xff08;Deep Copy&#xff09;意味着创建一个对象的副本&#xff0c;使得原对象和副本对象完全分离&#xff0c;对副本对象的任何修改都不会影响到原对象。以下是几种实现深拷贝的方法&#xff1a; 1. 手动实现深拷贝 对于自定义类&#xff0c;…...

位置编码-APE

Transformer 中的绝对位置编码 &#xff08;以下由gpt 生成&#xff09; Transformer 的绝对位置编码&#xff08;Absolute Position Encoding, APE&#xff09;是用于对序列数据中的位置信息进行建模的一种方法。在 Transformer 的架构中&#xff0c;输入数据&#xff08;如句…...

MySQL有哪些锁?

1.MySQL有哪些锁&#xff1f; 全局锁表级锁 表锁元数据锁意向锁 行级锁 记录锁间隙锁临键锁临时意向锁 我了解的是MySQL的锁可以分为全局锁、表级锁、行级锁。 我比较熟悉的是表级锁和行级锁&#xff0c;如果我们对表结构进行修改时&#xff0c;MySQL就会对这个表结构加一个…...

Everything实现,快速搜索文件

最近编写NTFS文件实时搜索工具, 类似 Everything 这样, 翻阅了很多博客, 结果大致如下: 1.分析比较肤浅, 采用USN日志枚举来获取文件记录 速度一言难尽, 因为日志枚举的是全盘所有文件的所有日志, 记录比文件记录还多, 速度当然很慢, 还有的甚至于是 使用 DeviceIoControl 函数…...

[硬件] DELL BIOS 相关注意事项

前言 前段时间重装系统. DELL BIOS属实资料少, 又难用. 这里给出相关的注意事项, 并且配上图片. BIOS相关注意事项 进入BIOS ESC/F2/ F12. 都可以进入BIOS, 当进U盘的入Win PE系统时, 使用F12 效果更佳. 关闭安全模式 切换到Boot Configuration选项,将Secure Boot选项off选…...

Rocky Linux 下安装Liboffice

Rocky Linux下安装Liboffice。 Step1: 在桌面&#xff0c;单击击键盘的Window键&#xff0c;点击出现的白色software按钮图标&#xff1b; Step2: 输入lib&#xff0c;即可自动跳出libre Office, 进行安装&#xff1b; Step3: Have fun with Rocky Linux....

【每日学点鸿蒙知识】长时任务、HarmonyAppProvision申请、preferences、Testing工具、应用保活

1、HarmonyOS 如何解决语音聊天、通信app退后台系统采集播放回调就会停止&#xff0c;回前台未恢复&#xff1f; 关于应用切到后台系统采集播放回调停止的问题原因如下&#xff1a;为了降低设备耗电速度、保障用户使用流畅度&#xff0c;系统会对退至后台的应用进行管控&#…...

步进电机驱动算法——S形加减速算法原理

1. 前言&#xff1a; 最近项目又用到了步进电机&#xff0c;为了在运动中加减速更加平稳决定研究一下S型加减速&#xff0c;原来用过野火的s型加减速程序&#xff0c;云里雾里的移植成功了&#xff0c;今天再翻来程序看一脸懵逼&#xff0c;重新学习了一下发现所有公式都能看懂…...

【图像去噪】论文复现:大道至简!ZS-N2N的Pytorch源码复现,跑通源码,获得指标计算结果,补充保存去噪结果图像代码,代码实现与论文理论对应!

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 完整代码和训练好的模型权重文件下载链接见本文底…...

2024年中国新能源汽车用车发展怎么样 PaperGPT(一)

概述 在国家政策的强力扶持下&#xff0c;2024年中国新能源汽车市场迎来了新的发展机遇。本文将基于《中国新能源汽车用车报告&#xff08;2024年&#xff09;》的数据&#xff0c;对新能源汽车的市场发展和用车趋势概述。 新能源汽车市场发展 政策推动&#xff1a;国家和地…...

数据结构-排序思想

直接插入排序 将后面的无序区中的元素挨个向前面的有序区中插入。 1.将顺序表中R[0]用作哨兵&#xff0c;按索引i2...n的次序&#xff0c;将R[i]向有序区R[1...i-1]中执行插入操作。 2.插入操作可采取在有序区中从后向前的查找比较和移动的方法。 3.此操作中比较的次数与原序列…...

python 快速排序(Quick Sort)

快速排序&#xff08;Quick Sort&#xff09; 快速排序是一种高效的排序算法&#xff0c;采用分治法&#xff08;Divide and Conquer&#xff09;策略。它的基本思想是&#xff1a;选择一个基准元素&#xff08;pivot&#xff09;&#xff0c;将数组分为两部分&#xff0c;使得…...

MySQL数据库——常见慢查询优化方式

本文详细介绍MySQL的慢查询相关概念&#xff0c;分析步骤及其优化方案等。 文章目录 什么是慢查询日志&#xff1f;慢查询日志的相关参数如何启用慢查询日志&#xff1f;方式一&#xff1a;修改配置文件方式二&#xff1a;通过命令动态启用 分析慢查询日志方式一&#xff1a;直…...

【AIGC篇】AIGC 引擎:点燃创作自动化的未来之火

&#xff1a;羑悻的小杀马特.-CSDN博客 未来都是惊喜。你生来本应为高山。并非草芥。 引言&#xff1a; 在当今数字化的时代&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;正以一种前所未有的力量改变着我们的创作领域。它就像一个神秘而强大的魔法师&#xff0c;…...

C语言性能优化:从基础到高级的全面指南

引言 C 语言以其高效、灵活和功能强大而著称&#xff0c;被广泛应用于系统编程、嵌入式开发、游戏开发等领域。然而&#xff0c;要写出高性能的 C 语言代码&#xff0c;需要对 C 语言的特性和底层硬件有深入的了解。本文将详细介绍 C 语言性能优化的背后技术&#xff0c;并通过…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...