基础CRUD操作文件记录
基本的插入、更新、删除、更多查看 GROM官网 查询
默认不使用全局日志输出,可以在执行前的代码加上Debug()
可以输出执行的SQL语句
例如:db.Debug().Unscoped().Delete(&user)
package main
import (
"fmt"
"time"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
// User 用户结构体
type User struct {
gorm.Model
Name string `gorm:"size:100"`
Age uint `gorm:"size:3"`
Address string `gorm:"type:varchar(100)"`
Money float64 `gorm:"type:decimal(10,2)"`
Birthday time.Time
}
// TableName 通过TableName方法将User表命名为`sys_users`
func (user User) TableName() string {
return "sys_user"
}
// BeforeCreate 想在BeforeCreate hook 中修改字段的值
func (user *User) BeforeCreate(scope *gorm.Scope) error {
fmt.Println("结构创建前")
// scope.SetColumn("ID", uuid.New())
return nil
}
// BeforeUpdate 想在BeforeUpdate hook 中修改字段的值
func (user *User) BeforeUpdate(scope *gorm.Scope) error {
fmt.Println("结构更新前")
// 使用UpdateColumn, UpdateColumns不会触发
// scope.SetColumn("ID", uuid.New())
return nil
}
// AfterUpdate 想在AfterUpdate hook 中修改字段的值
func (user *User) AfterUpdate(scope *gorm.Scope) error {
fmt.Println("结构更新后")
// 使用UpdateColumn, UpdateColumns不会触发
// scope.SetColumn("ID", uuid.New())
return nil
}
// BeforeSave 想在BeforeSave hook 中修改字段的值
func (user *User) BeforeSave(scope *gorm.Scope) error {
fmt.Println("结构保存前")
// 使用UpdateColumn, UpdateColumns不会触发
// scope.SetColumn("EncryptedPassword", pw)
return nil
}
// String 用户字符串化
func (user *User) String() string {
return fmt.Sprintf("编号:%d ,名字:%s ,年龄: %d , 金钱: %.3f , 生日:%s", user.ID, user.Name, user.Age, user.Money, user.Birthday)
}
// 基础CRUD
func main() {
db, err := gorm.Open("mysql", "username:password@(127.0.0.1:3306)/database?charset=utf8&parseTime=True&loc=Local")
if err != nil {
println("err", err)
}
defer db.Close()
// 创建表
// db.CreateTable(&User{})
// 检查表是否存在
// db.HasTable(&User{})
// 删除表
// db.DropTable(&User{})
// 不存在表时创建
db.AutoMigrate(&User{})
// 插入
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now(), Money: 123.34}
fmt.Printf("数据库内结果主键为空 %t \n", db.NewRecord(user))
db.Create(&user)
// fmt.Println(user.String())
// 更新单属性
// db.Model(&user).Update("name", "update")
// 更新根据给定的条件更新单个属性
//db.Model(&user).Where("age = ?", 18).Update("name", "update")
// 更新使用 struct 更新多个属性,只会更新其中有变化且为非零值的字段
// db.Model(&user).Updates(User{Name: "update", Age: 66, Ac: 99.99})
// fmt.Println(user.String())
// 删除现有记录 只会将DeletedAt 字段的值会被设置为当前时间
// db.Delete(&user)
// 直接清除记录
// db.Unscoped().Delete(&user)
// 条件删除
// db.Where("name LIKE ?", "%update%").Delete(User{})
// fmt.Println(user.String())
// user := User{}
// 通过主键查询第一条记录
// db.First(&user)
// 随机取一条记录
// db.Take(&user)
// 通过主键查询最后一条记录
// db.Last(&user)
// 查询指定的某条记录ID(只可在主键为整数型时使用)
// db.First(&user, 1)
// 通过条件查询第一条记录
// db.Where("age = ?", "18").First(&user)
// fmt.Println(user.String())
var users []User
// 拿到所有的记录
db.Find(&users)
// 通过条件指定字段查询
// db.Where("age = ?", "18").Find(&users)
// 通过条件多指定字段查询
// db.Where("name = ? AND age >= ?", "jinzhu", "18").Find(&users)
// 通过条件<>查询关键字前后
// db.Where("name <> ?", "jinzhu").Find(&users)
// 通过条件in查询关键字是否存在
// db.Where("age IN (?)", []float64{18, 20}).Find(&users)
// 通过条件link模糊查询
// db.Where("name LIKE ?", "%jin%").Find(&users)
// 通过条件BETWEEN AND区间范围查询
// db.Where("created_at BETWEEN ? AND ?", "2019-11-15 19:17:03", time.Now()).Find(&users)
// 通过条件>指定值查询
// db.Where("created_at > ?", "2019-11-15 10:17:03").Find(&users)
// 通过条件不等值查询 类似where
// db.Not("created_at > ?", "2019-11-15 10:17:03").Find(&users)
// 通过条件Or查询 Struct 结构体参数
// db.Where("name = 'jinzhu'").Or(User{Name: "jinzhu 2"}).Find(&users)
// 通过条件Or查询 Map 多值条件
// db.Where("name = 'jinzhu'").Or(map[string]interface{}{"name": "jinzhu1234"}).Find(&users)
// 通过Select,指定你想从数据库中检索出的字段,默认会选择全部字段
// db.Select([]string{"name", "age"}).Find(&users)
// 查询软删除记录
// db.Debug().Unscoped().Where("deleted_at is not NULL").Find(&users)
for i, v := range users {
fmt.Println(i, v.String())
}
// 恢复删除记录
// user := User{}
// db.Unscoped().Where("deleted_at is not NULL and id = ?", 5).Find(&user)
// db.Unscoped().Model(&user).Where("deleted_at is not NULL").Update("deleted_at", nil)
// fmt.Println(user.String())
}