记录ORM
的使用方式
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"time"
)
type Product struct {
gorm.Model
Code string
Price uint
}
type User struct {
gorm.Model
Name string
Age uint
Birthday time.Time
}
func main() {
//quickStart()
moreUse()
}
func moreUse() {
dsn := "root:cpf..0051@/gorm_learn" + "?charset=utf8mb4&parseTime=true&loc=Local" // 不设置parseTime会报错 loc设置时区为本地
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("连接数据库失败, ")
}
// 创建表
db.AutoMigrate(&User{})
//user := User{Name: "zhang", Age: 88, Birthday: time.Now()}
//// 创建记录
//result := db.Create(&user)
//fmt.Printf("添加记录: id: %v, err: %v, rows: %v", user.ID, result.Error, result.RowsAffected)
//// 用指定字段创建记录
// 创建记录,并更新给出的字段
//result := db.Select("Name", "Age", "CreatedAt").Create(&user) // 创建一个新记录,生日字段没有被更新
// 创建记录,并更新未给出的字段
//result := db.Omit("Name", "Age", "createdAt").Create(&user) // 创建新记录,只更新了 birthday 字段
//// 批量插入
//var users = []User{{Name: "xiaowang", Birthday: time.Now()}, {Name: "xiaoli", Birthday: time.Now()}, {Name: "xiaohong", Birthday: time.Now()}}
//db.Create(&users)
// 指定数量批量传(目前暂未发现和上面有什么区别)
//var users = []User{{Name: "zz", Birthday: time.Now()} , {Name: "aa", Birthday: time.Now()}}
//db.CreateInBatches(users, 1)
//// 查询
// 用主键检索
//var user User
//result := db.First(&user, 10) // 传一个空结构体进去,获取到id=10的记录
// 用多个主键检索
//var users []User
//result := db.Find(&users, []int{2, 4, 6}) // 获取主键 2 4 6 的数据
//for i := 0; i < len(users); i++ {
// user := users[i]
// fmt.Printf("记录: id: %v, err: %v, rows: %v \n", user.ID, result.Error, result.RowsAffected)
//}
// 检索全部对象
//var users []User
//db.Find(&users)
//// 条件查询
// 获取第一条匹配的记录
//var user User
//result := db.Where("name = ?", "susan").First(&user)
// 其他如:全部匹配 模糊匹配 And匹配 时间区域匹配 区间匹配 见官方文档 https://gorm.io/zh_CN/docs/query.html
//// 复合语句
//db = db.Where("name = ?", "zhang")
//db = db.Where("age=?", 88)
//var count int64
//result := db.Model(&User{}).Count(&count) // 使用 db.Model 设置表名
//result := db.Table("users").Count(&count) // 使用 db.Table("tableName") 设置要查找的表名
//fmt.Printf("记录: count: %v, err: %v, rows: %v \n", count, result.Error, result.RowsAffected)
//defer fmt.Printf("添加记录: id: %v, err: %v, rows: %v \n", count, result.Error, result.RowsAffected)
}
func quickStart() {
// dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
dsn := "root:cpf..0051@/gorm_learn" + "?charset=utf8mb4&parseTime=true&loc=Local" // 不设置parseTime会报错 loc设置时区为本地
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
})
if err != nil {
panic("连接数据库失败, ")
}
// 迁移scheme (根据结构体里的字段创建一张表)
db.AutoMigrate(&Product{})
// 创建 (添加一条记录)
db.Create(&Product{Code: "T1250", Price: 165})
// 读取
var product Product // 某条q记录
var product1 Product
db.First(&product, 1) // 根据整形主键查找
fmt.Printf("主键为1的记录: %v %v \n", product.Price, product.Code)
db.First(&product1, "code = ?", "D42") // 查找 code 字段为 D42 的记录 (!!!!注意:这里如果使用 &product, 则报错: record not found)
fmt.Printf("code为D42的记录: %v %v \n", product1.Price, product1.Code)
// 更新
// 将 price更新为 200
//db.Model(&product).Update("Price", 208)
// 更新多个字段
db.Model(&product).Updates(Product{Price: 44, Code: "F42"}) // 使用模型数据,仅更新非零值字段
fmt.Printf("记录: %v %v \n", product.Price, product.Code)
//db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F44"}) // 使用字典
//fmt.Printf("记录: %v %v \n", product.Price, product.Code)
// 删除记录
db.Delete(&product)
}
网友评论