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可操作的命令
三、ORM的操作
1、tag标签的更改字段名字
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()
将整数相加
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启动事务
将cmdb中的修改为orm模式
同步数据库操作
如果看完对自己有所帮助,请点赞支持,谢谢大家