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 intName stringGender boolTel string
}
5、注册数据模型;
type User struct {ID intName stringGender boolTel 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 mainimport ("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:05user := &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 mainimport ("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:05dsn := "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) //优先填充useruser.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 []*Userqueryset.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对象squeryset := ormer.QueryTable(&User{}) //&User{}对象或者"user"(表名)或者new(User)获取queryseter对象var users []*Userqueryset.Limit(3).Offset(2).All(&users)for _, v := range users {fmt.Println(v)}
排序
ormer := orm.NewOrm() //创建orm对象squeryset := 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 []*Userqueryset.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全部修改为kk2queryset.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 *Userrawseter := ormer.Raw("select * from user where id =?", 2)rawseter.QueryRow(&user)fmt.Println(user)
返回切片
ormer := orm.NewOrm()var users []orm.Paramsrawseter := ormer.Raw("select * from user ")rawseter.Values(&users)for _, v := range users {fmt.Println(v["name"])}
orm启动事务
将cmdb中的修改为orm模式
同步数据库操作
如果看完对自己有所帮助,请点赞支持,谢谢大家
GROM学习之路(一)相关推荐
- Redis学习之路(一)--下载安装redis
redis学习之路--下载安装redis windows安装redis 1.下载redis 2.安装 3.查看是否安装成功 windows安装redis 1.下载redis 网址:https://gi ...
- 前端Vue学习之路(二)-Vue-router路由
Vue学习之路 (二) Vue-router(基础版) 一.增加静态路由 二.动态路由+路由嵌套+404页面 三. 编程式导航 四.命名路由 五.命名视图 六.重定向和起别名 1.重定向 2.起别名 ...
- 前端Vue学习之路(一)-初识Vue
Vue学习之路 (一) 1.引言 2.更换npm国内镜像源 3.用npm下载Vue 4.Vue全家桶 5.使用命令创建项目 5.推荐插件 6.推荐网站 7.学习扩展 1.引言 先安装node.js环境 ...
- 学习之路-现代密码学基础-001
学习之路-现代密码学基础-第一章密码学概论 转载于:https://www.cnblogs.com/vegetables-Adanos/p/5371420.html
- 拿下斯坦福和剑桥双offer,00后的算法学习之路
董文馨,00后,精通英语,西班牙语.斯坦福大学计算机系和剑桥大学双Offer,秋季将进入斯坦福大学学习. 10岁开始在国外上学:12岁学Scratch: 13岁学HTML & CSS: 14岁 ...
- Markdown学习之路
Markdown学习之路 作者:CFishHome 转载请注明地址:https://blog.51cto.com/12731497/2164274 Markdown是什么? Markdown是一个 W ...
- [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...
本文是为后面的学习之路做铺垫,简单介绍下企业库中的Validation模块的一些相关知识,包括Validation模块的简介.用途.使用方法.默认提供的多种验证器的介绍等. 一.简介及用途 在实际的项 ...
- 转载: Qt 学习之路 2归档
Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/
- python之路 mysql 博客园_教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql...
教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql Easy_install安装MySQLdb 很简单,以至于我不晓得该怎么说.一句话. sodu ...
最新文章
- ISV页面中获取当前用户信息
- 用了ReSharpe硬是爽
- python join函数_一行 Python 代码能实现这么多丧心病狂的功能?
- Insider Dev Tour 2019 | 以技术之力,展现传承魅力
- python开学吧真假,开学第一课,课课有总结
- python受欢迎的原因是什么?
- 【最小生成树】Prim算法和Kruskal算法的区别对比
- 【转】使用Boost Graph library(二)
- 斯坦福大学自然语言处理第三课“最小编辑距离(Minimum Edit Distance)”
- 使用Sharepoint Services 3.0构建基本网站
- 计算机物联网工程学什么,物联网工程主要学什么 物联网工程专业课程有哪些...
- 企业运营管理体系是什么?
- 03、单线通讯—SIF通讯协议(一线通)案例二
- 将类似html数据打印机,白激光打印机的工作原理.doc
- 日本财险容灾案例揭示小公司的容灾之道
- linux系统的超级管理员,系统的超级管理员:root《 Linux 文件与目录权限 》
- 万字长文,带你入门异步编程
- 关于从3维空间进入4维空间的想法
- 迪士尼2016年压轴巨作---《海洋奇缘》观后感
- 对冲基金到底是什么:细数对冲基金的七种武器
热门文章
- KBengine常见错误总结
- kbengine源码_kbengine mmo源码(完整服务端源码+资源+完整客户端源码)
- python怎么遍历文件夹内的删除文件_python遍历文件夹并删除特定格式文件的示例...
- 使用SymPy求微分方程
- 分享计算机专业学习路线(转)
- XXX不是内部或外部命令,也不是可运行的程序或批处理文件的解决
- if语句计算狗狗年龄相当于人类年龄的多少?
- Element-UI+Vue使用cell-style=“cellStyle“改变单元格字体样式
- Customizable constraint systems for succinct arguments学习笔记(1)
- 功能安全function safety 和SOTIF区别