GROM学习之路(一)

GROM学习之路(一)

一、定义
GROM学习之路(一)
解释:相当于UCML平台的对应关系,将数据库中的数据对应成对象实例。

二、Orm的执行流程

1、导入包;

import (
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
)

2、注册驱动和数据库;

	dsn := "root:root@tcp(localhost:3306)/testorm?charset=utf8mb4&parseTime=true&loc=PRC"
	orm.RegisterDriver("mysql", orm.DRMySQL)    //beego中自己注册,可以省略注册这一项
	orm.RegisterDataBase("default", "mysql", dsn) //第一个参数为别名,第二个参数为数据库

4、定义数据库模型(结构体) model;

type User struct {
	ID     int
	Name   string
	Gender bool
	Tel    string
}

5、注册数据模型;

type User struct {
	ID     int
	Name   string
	Gender bool
	Tel    string
}
    orm.RegisterModel(&User{})                    //或者new(User),注册模型
	orm.RunCommand()    //RunCommand运行
	orm.RunSyncdb("default", true, true) //第一个参数为别名,第二个参数为判断是否为强制同步,第三个参数为是否显示执行过程

6、操作,同步表结构,数据:增删查改;

go run main.go  orm   //查看orm可操作的命令

GROM学习之路(一)
GROM学习之路(一)
三、ORM的操作

1、tag标签的更改字段名字
GROM学习之路(一)
2、相关函数

func (m *UserMode) TableName() string {
	return "user"
} //更换表的默认名字

func (m *UserMode) TableIndex() [][]string {
	return [][]string{
		{"ID"},
		{"Name"},
		{"ID", "Name"},
	}
} //创建联合索引
func (m *UserMode) TableEngine() string {
	return "myisam"
} //修改储存方式

3、增删查改

(1)增加对象数据到数据库中

package main

import (
	"fmt"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
	"time"
)

type User struct {
	ID       int        `orm:"column(id);pk;auto;"`
	Name     string     `orm:"column(name);size(8)"`
	Gender   bool       `orm:"column(gender)"`
	Tel      string     `orm:"column(tel);size(11)"`
	Birthday *time.Time `orm:"type(date)"`
}

func main() {
	t, _ := time.Parse("2006-01-02", "2013-01-03") //时间刷新必须为2006-01-02 15:04:05
	user := &User{
		Name:     "yang",
		Gender:   true,
		Tel:      "13253647586",
		Birthday: &t,
	}
	dsn := "root:root@tcp(localhost:3306)/testorm?charset=utf8mb4&parseTime=true&loc=PRC"
	orm.RegisterDriver("mysql", orm.DRMySQL)      //beego中自己注册,可以省略注册这一项
	orm.RegisterDataBase("default", "mysql", dsn) //第一个参数为别名,第二个参数为数据库
	orm.RegisterModel(&User{})                    //或者new(User),注册模型
	ormer := orm.NewOrm()                         //创建orm对象
	fmt.Printf("%#v\n", user)
	ormer.Insert(user) //将user对象插入到数据库中

}

增加多个对象到数据库中

package main

import (
	"fmt"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
	"time"
)

type User struct {
	ID       int        `orm:"column(id);pk;auto;"`
	Name     string     `orm:"column(name);size(8)"`
	Gender   bool       `orm:"column(gender)"`
	Tel      string     `orm:"column(tel);size(11)"`
	Birthday *time.Time `orm:"type(date)"`
}

func main() {
	t, _ := time.Parse("2006-01-02", "2013-01-03") //时间刷新必须为2006-01-02 15:04:05
	dsn := "root:root@tcp(localhost:3306)/testorm?charset=utf8mb4&parseTime=true&loc=PRC"
	orm.RegisterDriver("mysql", orm.DRMySQL)      //beego中自己注册,可以省略注册这一项
	orm.RegisterDataBase("default", "mysql", dsn) //第一个参数为别名,第二个参数为数据库
	orm.RegisterModel(&User{})                    //或者new(User),注册模型
	ormer := orm.NewOrm()                         //创建orm对象
	var users []*User = make([]*User, 3, 3)
	for i := 0; i < 3; i++ {
		user := &User{
			Name:     fmt.Sprintf("user%d", i),
			Gender:   true,
			Tel:      "13253647586",
			Birthday: &t,
		}
		users[i] = user
	}
	fmt.Println(ormer.InsertMulti(1, users)) //第一个参数指执行几个对象插入(从0开始)
}

对象不存在的时候创建

	ormer.ReadOrCreate(user, "Name")

根据user名字查看,如果数据库中没有这一项,则创建这一条数据。

(2)读取用户

根据某一个条件

	ormer := orm.NewOrm()                         //创建orm对象
	user := &User{
		ID: 2,
	}
	err := ormer.Read(user) //根据用户ID查询数据库填充user对象
	fmt.Println(user, err)

多条件查询,必须保证数值为唯一

	ormer := orm.NewOrm()                         //创建orm对象
	user := &User{
		ID:   1,
		Name: "yang1",
	}
	err := ormer.Read(user, "ID", "Name") //根据用户ID和Name多个条件查询数据库查询填充user对象
	fmt.Println(user, err)

(3)更改

	ormer := orm.NewOrm()                         //创建orm对象
	user := &User{
		ID: 1,
	}
	ormer.Read(user) //优先填充user
	user.Name = "修改"
	ormer.Update(user) //对user进行修改

(4)删除

	ormer := orm.NewOrm()                         //创建orm对象
	user := &User{
		Name: "yang1",
	}
	ormer.Read(user, "Name")
	ormer.Delete(user) //删除Name为yang1的数据

4、查询扩展

(1) QueryTable

	ormer := orm.NewOrm()                         //创建orm对象
	queryset := ormer.QueryTable(&User{})         //&User{}对象或者"user"(表名)或者new(User)获取queryseter对象
	fmt.Println(queryset.Count())                 //查询行数
	var users []*User
	queryset.All(&users)
	for k, v := range users {
		fmt.Println(k, v)
	}

Filter操作的方法,加字母i忽略大小写

	ormer := orm.NewOrm()                                          //创建orm对象
	queryset := ormer.QueryTable(&User{})                          //&User{}对象或者"user"(表名)或者new(User)获取queryseter对象
	fmt.Println(queryset.Filter("id__iexact", 1).Count())          //查询id为1的值,可以省略exact的值
	fmt.Println(queryset.Filter("name__contains", "user").Count()) //查询包含user的数据库字段数
	fmt.Println(queryset.Filter("name__startswith", "y").Count())  //查询开始为y的值
	fmt.Println(queryset.Filter("name__endswith", "y").Count())    //查询结束为y的值
	fmt.Println(queryset.Filter("id__in", []int{1, 2, 3}).Count()) //判断id在切片中的数量

不等于

	fmt.Println(queryset.Exclude("name__iexact", "user").Count()) //查询不包含user的值

多重条件

	fmt.Println(queryset.Filter("id__gt", 1).Filter("id__lt", 3).Count()) //查询id大于1小于3的值

分页

ormer := orm.NewOrm()                         //创建orm对象s
	queryset := ormer.QueryTable(&User{})         //&User{}对象或者"user"(表名)或者new(User)获取queryseter对象
	var users []*User
	queryset.Limit(3).Offset(2).All(&users)
	for _, v := range users {
		fmt.Println(v)
	}

排序

	ormer := orm.NewOrm()                         //创建orm对象s
	queryset := ormer.QueryTable(&User{})         //&User{}对象或者"user"(表名)或者new(User)获取queryseter对象
	var users []*User
	//queryset.OrderBy("-id").All(&users)        //按照id逆序排列输出,把-号去掉就按照正序排列
	queryset.OrderBy("id", "Name").All(&users) //按照多个条件排序
	for _, v := range users {
		fmt.Println(v)
	}

复杂条件定义

ormer := orm.NewOrm()
	queryset := ormer.QueryTable(&User{})
	//复杂条件的定义, name like '%kk%' and (tel like '152%' or tel like '158%')
	cond := orm.NewCondition() //创建一个Condition对象
	conTel := orm.NewCondition()
	conTel = conTel.Or("name__iexact", "yang").Or("name__iexact", "user0")
	cond = cond.And("id", 1).AndCond(conTel)
	var users []*User
	queryset.SetCond(cond).All(&users)
	for _, v := range users {
		fmt.Println(v)
	}

5、批量删除、修改

	ormer := orm.NewOrm()
	queryset := ormer.QueryTable(&User{})
	queryset.Filter("id__gt", 4).Update(orm.Params{"name": "kk2"}) //把id大于4的name全部修改为kk2
	queryset.Filter("id__gt", 7).Delete()

将整数相加
GROM学习之路(一)
6、原始语句查询

(1)直接使用sql.db

db, err := orm.GetDB("default")
	if err != nil {
		fmt.Println(err)
	}
	db.QueryRow("name").Scan()
	db.Exec(...)

(2) orm包

	ormer := orm.NewOrm()
	rawseter := ormer.Raw("insert into user(name,gender,Birthday) values (?,?,?)", "test", true, &t)
	fmt.Println(rawseter.Exec())

查询后获取值

	ormer := orm.NewOrm()
	var user *User
	rawseter := ormer.Raw("select * from user where id =?", 2)
	rawseter.QueryRow(&user)
	fmt.Println(user)

返回切片

	ormer := orm.NewOrm()
	var users []orm.Params
	rawseter := ormer.Raw("select * from user ")
	rawseter.Values(&users)
	for _, v := range users {
		fmt.Println(v["name"])
	}

orm启动事务
GROM学习之路(一)

将cmdb中的修改为orm模式

同步数据库操作
GROM学习之路(一)

如果看完对自己有所帮助,请点赞支持,谢谢大家

上一篇:MyBatis 相关概念


下一篇:Golang之ORM框架Gorm快速开始