介绍
上文 gorm基础04–CRUD 接口-查询 介绍了gorm 中常见查询方法,本文继续介绍gorm中常见的更新方法。具体包括 保存所有字段、更新单个列、更新多个列、更新选定字段、批量更新 等。
案例
updateAllFields(db) 保存所有字段
updateSingleField(db) 更新单个列
updateMultiFields(db) 更新多个列
updateSelectedFields(db) 更新选定字段
updateBatch(db) 批量更新
源码:
package main
import (
"database/sql"
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/schema"
"time"
)
type User struct {
ID uint
Name string
Email string
Age uint8
Birthday time.Time
MemberNumber sql.NullString
ActivatedAt sql.NullTime
CreatedAt time.Time
UpdatedAt time.Time
Active bool
Role string
}
func getDb() *gorm.DB {
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: "root:111111@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
DefaultStringSize: 256, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
}), &gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true}})
fmt.Printf("getDb db=%v, err=%v\n", db, err)
return db
}
func updateAllFields(db *gorm.DB) {
var user User
db.First(&user)
user.Name = "jinzhu 001"
user.Age = 100
db.Save(&user)
}
func updateSingleField(db *gorm.DB) {
var user User
// 条件更新
db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;
// User 的 ID 是 `111`
db.First(&user)
db.Model(&user).Update("name", "hello02")
// UPDATE users SET name='hello02', updated_at='2013-11-17 21:34:10' WHERE id=111;
// 根据条件和 model 的值进行更新
db.Model(&user).Where("active = ?", true).Update("age", 102)
// UPDATE users SET age=100, updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;
}
func updateMultiFields(db *gorm.DB) {
var user User
db.First(&user)
// 根据 `struct` 更新属性,只会更新非零值的字段
db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;
// 根据 `map` 更新属性
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
// UPDATE users SET name='hello', age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;
}
func updateSelectedFields(db *gorm.DB) {
var user1, user2, user3, user4, user5 User
db.First(&user1)
fmt.Println("user1=%v", user1)
// 使用 Map 进行 Select
// User's ID is `111`:
db.Model(&user1).Select("name").Updates(map[string]interface{}{"id": user1.ID, "name": "hello01", "age": 18, "active": false})
// UPDATE users SET name='hello' WHERE id=111;
db.Find(&user2, 2)
fmt.Println("user2=%v", user2)
db.Model(&user2).Omit("active").Updates(map[string]interface{}{"id": 2, "name": "hello02", "age": 18, "active": false})
// UPDATE users SET age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;
// 使用 Struct 进行 Select(会 select 零值的字段)
db.Find(&user3, 3)
fmt.Println("user3=%v", user3)
db.Model(&user3).Select("Name", "Age").Updates(User{ID: user3.ID, Name: "hello03", Age: 0})
// UPDATE users SET name='hello03', age=0 WHERE id=111;
// Select 所有字段(查询包括零值字段的所有字段)
db.Find(&user4, 4)
fmt.Println("user4=%v", user4)
db.Model(&user4).Select("*").Updates(User{ID: user4.ID, Name: "jinzhu04", Role: "admin", Age: 0, Birthday: time.Now(), CreatedAt: user4.CreatedAt})
// Select 除 Role 外的所有字段(包括零值字段的所有字段)
db.Find(&user5, 5)
fmt.Println("user5=%v", user5)
db.Model(&user5).Select("*").Omit("Role").Updates(User{ID: user5.ID, Name: "jinzhu05", Role: "admin", Age: 0, Birthday: time.Now(), CreatedAt: user5.CreatedAt})
}
func updateBatch(db *gorm.DB) {
// 根据 struct 更新
db.Model(User{}).Where("role = ?", "admin").Updates(User{Name: "hello", Age: 18})
// UPDATE users SET name='hello', age=18 WHERE role = 'admin';
// 根据 map 更新
db.Table("user").Where("id IN ?", []int{10, 11}).Updates(map[string]interface{}{"name": "hello", "age": 18})
// UPDATE users SET name='hello', age=18 WHERE id IN (10, 11);
}
func main() {
db := getDb()
db.AutoMigrate(User{})
//updateAllFields(db)
//updateSingleField(db)
//updateMultiFields(db)
//updateSelectedFields(db)
updateBatch(db)
}
测试:
保存所有字段
更新单个列
更新多个列
更新选定字段
批量更新
说明
gorm官方文档 CRUD 接口-更新