package main

import (
	"fmt"

	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

//type User struct {
//	ID        uint   `gorm:"primaryKey"`
//	Name      string `gorm:"size:100"`
//	Email     string `gorm:"size:100;unique"`
//	Age       int
//	UpdatedAt time.Time
//}

func main() {
	db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	db.AutoMigrate(&User{})

	// 插入测试数据
	user := User{Name: "Alice", Email: "alice@example.com", Age: 30}
	db.Create(&user)

	// 1. 更新单个字段
	db.Model(&User{}).Where("id = ?", user.ID).Update("name", "Alice Updated")
	fmt.Println("Updated single field")

	// 2. 更新多个字段（使用 map）
	db.Model(&User{}).Where("id = ?", user.ID).Updates(map[string]interface{}{
		"name": "Alice Smith",
		"age":  31,
	})
	fmt.Println("Updated multiple fields (map)")

	// 3. 更新多个字段（使用 struct，仅更新非零值）
	db.Model(&User{}).Where("id = ?", user.ID).Updates(User{
		Name: "Alice Johnson",
		Age:  32,
	})
	fmt.Println("Updated multiple fields (struct)")

	// 4. 强制更新零值字段
	db.Model(&User{}).Where("id = ?", user.ID).Update("age", 0)
	fmt.Println("Updated age to zero")

	// 5. 批量更新
	db.Model(&User{}).Where("age > ?", 25).Update("age", gorm.Expr("age + ?", 1))
	fmt.Println("Batch update completed")

	// 查询最终结果
	var finalUser User
	db.First(&finalUser, user.ID)
	fmt.Printf("Final user: %s (age=%d)\n", finalUser.Name, finalUser.Age)
}
