funcfindUsers(db *gorm.DB) { var user User // 根据主键 ID 查询 db.First(&user, 1) // SELECT * FROM users WHERE id = 1; fmt.Printf("First user (ID=1): %+v\n", user)
// 条件查询 db.First(&user, "name = ?", "Jinzhu") // SELECT * FROM users WHERE name = 'Jinzhu' ORDER BY id LIMIT 1; fmt.Printf("User by name Jinzhu: %+v\n", user)
// Take 不会按主键排序 db.Take(&user) // SELECT * FROM users LIMIT 1; fmt.Printf("Take one user: %+v\n", user) }
funcfindMultipleUsers(db *gorm.DB) { var users []User // 查询所有用户 db.Find(&users) // SELECT * FROM users; fmt.Printf("所有用户: %+v\n", users)
// 带条件查询 db.Where("age > ?", 30).Find(&users) // SELECT * FROM users WHERE age > 30; fmt.Printf("年龄大于30的用户: %+v\n", users)
// Or 条件 db.Where("name = ?", "Jinzhu").Or("name = ?", "Alice").Find(&users) // SELECT * FROM users WHERE name = 'Jinzhu' OR name = 'Alice'; fmt.Printf("Jinzhu 或 Alice: %+v\n", users)
// Not 条件 db.Not("name = ?", "Jinzhu").Find(&users) // SELECT * FROM users WHERE NOT name = 'Jinzhu'; fmt.Printf("不是 Jinzhu 的用户: %+v\n", users)
// In 条件 db.Where("name IN ?", []string{"Jinzhu", "Alice"}).Find(&users) // SELECT * FROM users WHERE name IN ('Jinzhu','Alice'); fmt.Printf("Jinzhu 或 Alice (IN): %+v\n", users) }
// Order 排序 db.Order("age desc, name").Find(&users) // SELECT * FROM users ORDER BY age desc, name; fmt.Printf("排序查询: %+v\n", users)
// Group By 和 Having type Result struct { RoleID uint Count int } var results []Result db.Model(&User{}).Select("role_id, count(id) as count").Group("role_id").Having("count > ?", 1).Find(&results) fmt.Printf("分组查询: %+v\n", results)
// Raw SQL db.Raw("SELECT id, name, age FROM users WHERE age > ?", 30).Scan(&users) fmt.Printf("Raw SQL 查询: %+v\n", users) }
3.3 更新 (Update)
3.3.1 更新单个字段
1 2 3 4 5 6 7 8 9 10 11 12 13
funcupdateUsers(db *gorm.DB) { var user User db.First(&user, 1) // 获取 ID 为 1 的用户
// 更新单个字段 db.Model(&user).Update("Name", "NewJinzhu") // UPDATE users SET name = 'NewJinzhu' WHERE id = 1; fmt.Printf("更新单个字段后: %+v\n", user)
// 条件更新 db.Model(&User{}).Where("active = ?", true).Update("Active", false) // UPDATE users SET active = false WHERE active = true; fmt.Println("条件更新活跃用户为非活跃") }
3.3.2 更新多个字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
funcupdateMultipleFields(db *gorm.DB) { var user User db.First(&user, 1)
// Updates 方法,使用 map 或结构体更新 db.Model(&user).Updates(User{Name: "UpdateName", Age: 50}) // UPDATE users SET name = 'UpdateName', age = 50, updated_at = '...' WHERE id = 1;
db.Model(&user).Updates(map[string]interface{}{"Name": "MapName", "Email": "map@example.com"}) // UPDATE users SET name = 'MapName', email = 'map@example.com', updated_at = '...' WHERE id = 1;
var fetchedUser User db.Preload("Orders").First(&fetchedUser, user.ID) fmt.Printf("查询带订单信息的用户: %+v\n", fetchedUser.Name) for _, order := range fetchedUser.Orders { fmt.Printf(" - 订单号: %s, 金额: %.2f\n", order.OrderSN, order.Amount) } }
4.3 多对多 (Many To Many)
多对多关联通常需要一个连接表 (Join Table) 来实现。
例如:User 和 Product (产品) 之间是多对多关系,User 可以购买多个 Product,Product 可以被多个 User 购买。
var fetchedUser User db.Preload("Products").First(&fetchedUser, user1.ID) fmt.Printf("User '%s' 购买了: \n", fetchedUser.Name) for _, p := range fetchedUser.Products { fmt.Printf(" - %s\n", p.Name) } }
4.4 关联关系图示
erDiagram
User ||--o{ Order : has
User ||--|{ CreditCard : has
User }o--o{ Product : buys
Role ||--o{ User : belongs_to