Gorm新手入门教程
官网:gorm中文官网
教程所在github地址:https://github.com/heqiang/gorm
一、 环境配置
安装
go get -u gorm.io/gorm
# mysql驱动 本文以mysql驱动为例
go get -u gorm.io/driver/mysql
# sqlite 驱动
go get -u gorm.io/driver/sqlite
二 、mysql数据库连接
dsn := "用户名:密码@tcp(ip:port)/dbName?charset=utf8mb4&parseTime=True&loc=Local"
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err!=nil{
fmt.Println("mysql conn err:",err)
}
三、MySql 模型迁移
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
type Product1 struct {
gorm.Model // 模型嵌套 自动生成以上字段
Code string
Price uint
Name string
}
// AutoMigrate 用于自动迁移您的 schema,保持您的 schema 是最新的
err := db.AutoMigrate(Product{})
if err != nil {
return nil, err
}
AutoMigrate 会自动创建数据库外键约束,您可以在初始化时禁用此功能
gorm.Open(mysql.Open(dsn), &gorm.Config{
DisableForeignKeyConstraintWhenMigrating: true,
})
GORM 提供了 Migrator 接口,该接口为每个数据库提供了统一的 API 接口
type Migrator interface {
AutoMigrate(dst ...interface{}) error
CurrentDatabase() string
FullDataTypeOf(*schema.Field) clause.Expr
CreateTable(dst ...interface{}) error
DropTable(dst ...interface{}) error
HasTable(dst interface{}) bool
RenameTable(oldName, newName interface{}) error
AddColumn(dst interface{}, field string) error
DropColumn(dst interface{}, field string) error
AlterColumn(dst interface{}, field string) error
HasColumn(dst interface{}, field string) bool
RenameColumn(dst interface{}, oldName, field string) error
MigrateColumn(dst interface{}, field *schema.Field, columnType *sql.ColumnType) error
ColumnTypes(dst interface{}) ([]*sql.ColumnType, error)
CreateConstraint(dst interface{}, name string) error
DropConstraint(dst interface{}, name string) error
HasConstraint(dst interface{}, name string) bool
CreateIndex(dst interface{}, name string) error
DropIndex(dst interface{}, name string) error
HasIndex(dst interface{}, name string) bool
RenameIndex(dst interface{}, oldName, newName string) error
}
四、gorm增删改查
1 增的相关操作
product := Product1{Code: "1024",Price: 128,Name:"测试"}
result:=db.Create(&product)
product.ID
result.Error
result.RowsAffected
用指定的字段插入数据
对应的sql语句 "insert into (Code,Name)values('xx','xx')"
db.Select("Code","Name").Create(&product)
对应的sql语句 "insert into (price)values('xx','xx')"
db.Omit("Code","Name").Create(&product)
批量插入
var products = []Product1{{Code: "1024",Price: 128,Name:"测试"}, {Code: "1023",Price: 128,Name:"测试"},{Code: "1023",Price: 128,Name:"测试"}}
db.Create(&products)
db.CreateInBatches(products, 100)
2 查的相关操作
单条查询
var pro Product1
// 查询第一个
// SELECT * FROM users ORDER BY id LIMIT 1;
db.First(&pro)
// 查询最后一条
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
db.Last(&pro)
// SELECT * FROM users LIMIT 1;
db.Take(&pro)
result := db.First(&user)
result.RowsAffected // returns count of records found
result.Error // returns error or nil
// check error ErrRecordNotFound
errors.Is(result.Error, gorm.ErrRecordNotFound)
// 以上单挑查询当表中没有数据的时候会报一个gorm.ErrRecordNotFound的错误
如何避免ErrRecordNotFound 错误?
你可以使用Find ,比如db.Limit(1).Find(&user) ,Find 方法可以接受struct和slice的数据,
Find 方法主要用于检索所有的数据
通过主键进行查询
var p1 model.Product1
db.First(&p1,10)
fmt.Println(p1)
var p2 []model.Product1
db.Find(&p2,[]int{1,2,3})
fmt.Println(p2)
String条件查询
func QueryByStringCondition(db *gorm.DB) {
var p1 model.Product1
db.Where("name =?", "测试0").First(&p1)
var p2 []model.Product1
db.Where("name =?", "测试").Find(&p2)
db.Where("name in", []string{"ceshi", "admin"}).Find(&p2)
db.Where("name Like ?", "%测%").Find(&p2)
db.Where("name =? And code>=?", "测试", "1020")
db.Where("updated_at<?",time.Now()).Find(&p2)
db.Where("code between ? and ?", 2, 6).Find(&p2)
for _, value := range p2 {
fmt.Println(value)
}
}
struct 和map 条件查询
这种查询可以理解位String查询的升级版
QueryByStructAndMap struct 和map 条件查询 区别:struct中查询字段为0,"",false或其他零值的会被过滤不会被用于构建查询条件 map会将所有查询的字段当做条件进行查询
func QueryByStructAndMap(db *gorm.DB) {
var p1 model.Product1
db.Where(&model.Product1{Name: "测试1", Code: "0",}).Find(&p1)
db.Where(map[string]interface{}{"name":"测试1","code":"0"})
db.Where([]int{1, 3, 5, 6}).Find(&p1)
var p2 []model.Product1
db.Where(&model.Product1{Name: "测试1"}, "name").Find(&p2)
for _, value := range p2 {
fmt.Println(value)
}
}
选择特定字段进行查询
func QueryBySpecialFiled(db * gorm.DB) {
var p1 []model.Product1
db.Select("name","price").Find(&p1)
for _,value:=range p1{
fmt.Println(value.Name)
}
db.Select([]string{"name","price"}).Find(&p1)
}
排序方式的查询
func QueryByOrder(db *gorm.DB) {
var p1 []model.Product1
db.Order("code desc,name").Find(&p1)
for _,value:=range p1{
fmt.Println(value)
}
}
limit && offset
Limit 指定获取记录的最大数量 Offset 指定在开始返回记录之前要跳过的记录数量
func QueryLimitAndOffset(db *gorm.DB) {
var p1 []model.Product1
db.Limit(3).Find(&p1)
var p2 []model.Product2
db.Limit(6).Find(&p2).Limit(-1).Find(&p1)
for _,value:=range p1{
fmt.Println("表1:",value)
}
for _,value:=range p2{
fmt.Println("表2:",value)
}
db.Offset(3).Limit(6).Find(&p1)
for _,value:=range p1{
fmt.Println(value)
}
}
|