beego框架学习(三) -orm的使用
2
3
4
5
6
7
8
9
10
11
|
目前beego-orm支持的数据有: - MySQL:https: //github.com/go-sql-driver/mysql - PostgreSQL:https: //github.com/lib/pq - Sqlite3:https: //github.com/mattn/go-sqlite beego-orm的相关特性 - 支持 Go 的所有类型存储 - 轻松上手,采用简单的 CRUD 风格 - 自动 Join 关联表 - 跨数据库兼容查询 - 允许直接使用 SQL 查询/映射 - 严格完整的测试保证 ORM 的稳定与健壮 |
orm的使用
- 导入orm的依赖:go get github.com/astaxie/beego/orm.
- 使用的步骤:
1.往orm注册默认数据库(包括数据库的连接的一些设置参数),往orm注册model。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
def. go /** *实体定义 */ type User struct { Id int `json: "id" pk: "auto" orm: "column(id)" ` Username string `json: "username" orm: "column(username)" ` Password string `json: "password" orm: "column(password)" ` Sex string `json: "sex" orm: "column(sex)" ` Tel string `json: "tel" orm: "column(tel)" ` } /** *数据相关配置 */ type DBConfig struct { Host string Port string Database string Username string Password string MaxIdleConns int //最大空闲连接 MaxOpenConns int //最大连接数 } |
1
|
usermanger. go |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
package service import ( "github.com/astaxie/beego/orm" "fmt" log "github.com/Sirupsen/logrus" _ "github.com/go-sql-driver/mysql" ) /** *CreatedBy:Hanyajun *Time:2017 2017/10/28 14:34 *Project:Go_study *Discription:使用orm操作mysql */ type UserManager struct { DBConf *DBConfig } /* * usermanger构造器 */ func NewUserManager(dbConf *DBConfig) *UserManager { mgr := &UserManager{ DBConf: dbConf, } mgr.initDB() //初始化orm return mgr } /** 初始化db,注册默认数据库,同时将实体模型也注册上去 */ func (mgr *UserManager) initDB() { orm.RegisterDriver( "mysql" , orm.DRMySQL) ds :=fmt.Sprintf( "%s:%s@tcp(%s:%s)/%s? charset=utf8" , mgr.DBConf.Username, mgr.DBConf.Password, mgr.DBConf.Host, mgr.DBConf.Port, mgr.DBConf.Database) log.Infof( "datasource=[%s]" , ds) err := orm.RegisterDataBase( "default" , "mysql" , ds, mgr.DBConf.MaxIdleConns, mgr.DBConf.MaxOpenConns) if err != nil { panic(err) } orm.RegisterModel(new(User)) } |
注意可以使用以下方式进行切换数据库:
1
2
3
4
5
6
|
orm.RegisterDataBase( "db1" , "mysql" , "root:root@/orm_db2?charset=utf8" ) orm.RegisterDataBase( "db2" , "sqlite3" , "data.db" ) o1 := orm.NewOrm() o1.Using( "db1" ) o2 := orm.NewOrm() o2.Using( "db2" ) |
2.操作数据库
对于要操作的数据库如果你知道它的主键,则你可以用orm对象的crud方法进行数据库的相关操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** *通过orm对象来进行数据库的操作,这种情况是必须要知道主键 */ func (mgr *UserManager) OpreateUserWithOrmObjct(id int) () { orm.Debug = true o := orm.NewOrm() var users = new(User) //注意使用new来创建变量,否则就会报错 users.Id = id fmt.Print( "******开始读取数据库*******" ) o.Read(users) fmt.Print(users) fmt.Print( "******开始更新数据库*******" ) users.Username = "123" o.Update(users) o.Read(users) fmt.Printf( "更新后的数据库为%v" , users) o.Delete(users) } |
如果你不知道主键则可以通过orm的Querytable或者Raw执行原始的sql语句来操作数据库。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/** 根据某些字段来read 1:采用queryTable方法来查询 2:采用Raw执行sql语句 */ func (mgr *UserManager) GetUsersByIdWithQueryTable(id string) (*[]User, error) { orm.Debug = true o := orm.NewOrm() user := new([]User) _, err := o.QueryTable( "user" ).Filter( "Id" , id).All(user) //err := o.QueryTable("user").Filter("id",key).One(user) //err:=o.Raw("select * from user where Id = ?",id).QueryRow(user)//使用sql语句进行查询 if err != nil { fmt.Println(err) return nil, err } return user, nil } |
3. 分页查询,可以使用limt方法来进行分页(注意limt后面的参数,第一个表示的是分页大小,第二个是指的偏移量,如同sql的offset)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
/** * 分页结构体 */ type Page struct { PageNo int PageSize int TotalPage int TotalCount int FirstPage bool LastPage bool List interface {} } func PageUtil(count int, pageNo int, pageSize int, list interface {}) Page { tp := count / pageSize if count % pageSize > 0 { tp = count / pageSize + 1 } return Page{ PageNo: pageNo, PageSize: pageSize, TotalPage: tp, TotalCount: count, FirstPage: pageNo == 1, LastPage: pageNo == tp, List: list } } func (mgr *UserManager) getUsrsWithPage(ps int, pageSize int) (page Page ) { o := orm.NewOrm() user:=new([]User) o.QueryTable( "user" ).Limit(pageSize,(ps-1)*pageSize).All(user) TotalCount,_:=o.QueryTable( "user" ).Count() page.TotalCount=int(TotalCount) page.PageSize=pageSize page.List=user fmt.Println(user) return page } |
除了以上方法操作数据库, QueryBuilder 提供了一个简便,流畅的 SQL 查询构造器。在不影响代码可读性的前提下用来快速的建立 SQL 语句,QueryBuilder 在功能上与 ORM 重合, 但是各有利弊。ORM 更适用于简单的 CRUD 操作,而 QueryBuilder 则更适用于复杂的查询,例如查询中包含子查询和多重联结。使用方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
// User 包装了下面的查询结果 type User struct { Name string Age int } var users []User // 获取 QueryBuilder 对象. 需要指定数据库驱动参数。 // 第二个返回值是错误对象,在这里略过 qb, _ := orm.NewQueryBuilder( "mysql" ) // 构建查询对象 qb.Select( "user.name" , "profile.age" ). From( "user" ). InnerJoin( "profile" ).On( "user.id_user = profile.fk_user" ). Where( "age > ?" ). OrderBy( "name" ).Desc(). Limit(10).Offset(0) // 导出 SQL 语句 sql := qb.String() // 执行 SQL 语句 o := orm.NewOrm() o.Raw(sql, 20).QueryRows(&users) 当然数据库操作必然离不开事物,orm支持简单的orm事物操作: o := NewOrm() err := o.Begin() // 事务处理过程 ... ... // 此过程中的所有使用 o Ormer 对象的查询都在事务处理范围内 if SomeError { err = o.Rollback() } else { err = o.Commit() } |
beego框架学习(三) -orm的使用的更多相关文章
- Beego框架学习--(核心:数据交互)
Beego框架学习记录 1.beego简介 beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计 ...
- Struts2框架学习(三) 数据处理
Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...
- Beego框架学习---layout的使用
Beego框架学习---layout的使用 在管理系统中,管理菜单的界面是固定的,会变化的只是中间的部分.我就在想,是不是跟angular的"组件模块的router-outlet一样&quo ...
- beego框架学习--beego orm映射
什么是ORM 即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作 ...
- Beego 框架学习(一)
Beego官网本身已经整理的非常详细了,但是作为一个学习者,我还是决定自己好好整理一下,这样在后面使用的时候自己对每部分才能非常熟悉,及时忘记了,也可以迅速定位自己要用的知识在哪里.当然也是对官网的一 ...
- Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..
PS:踏踏实实走好每一步... 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现 ...
- Beego 框架学习(一)
1.特性 beego是一个http框架 高性能,是目前最快的的go框架 开发快捷,组件多,高度解耦 RESTful方式,可以自定义action 文档完整 智能路由.智能监控 2.安装 go get g ...
- beego框架学习(二) -路由设置
路由设置 什么是路由设置呢?前面介绍的 MVC 结构执行时,介绍过 beego 存在三种方式的路由:固定路由.正则路由.自动路由,接下来详细的讲解如何使用这三种路由. 基础路由 从beego1.2版本 ...
- python flask框架学习(三)——豆瓣微信小程序案例(二)整理封装block,模板的继承
我们所要实现的效果: 点击电影的更多,跳转到更多的电影页面:点击电视剧的更多,跳转到更多的电视剧页面. 三个页面的风格相同,可以设置一个模板,三个页面都继承这个模板 1.在指定模板之前,把css放在一 ...
随机推荐
- ZOJ red black tree
#include <bits/stdc++.h> #define fi first #define se second #define lson l,m,rt<<1 #defi ...
- string::data
const char* data() const noexcept;注:同c_str #include <iostream>#include <string>#include ...
- poj2166 Heapsort[构造递推]
构造一个n个点的大根堆让全部弹出时交换位置次数最多. 真心佩服我自己智商,这种题都做不出来 交换是在每次弹出堆顶,然后把堆尾元素置于堆顶,然后向下调整时产生的.玩样例可以发现似乎数字1每次都出现在堆最 ...
- 使用vue写扫雷游戏
上班闲来没事做,,心血来潮.想用刚学的vue,写一个扫雷游戏..好了,直入正题. 第一步,先制作一个10x10的格子图..这个divcss就不说了..大家都会. 第二步,制造一个数组,用来生成随机雷区 ...
- PHP preg_match正则表达式
行定位符 ^表示开始 $表示结束 preg_match(模式,待搜索的字符串,$matches) 其中matches为可选参数,一旦匹配上,可以返回匹配结果 举个例子: $pattern = '/#\ ...
- SQL server 获取异常
一.try...... catch 获取异常信息 /*======================================== 相关错误消 息如下: ERROR_NUMBER() 返回错误号. ...
- 《转发》特征工程——categorical特征 和 continuous特征
from http://breezedeus.github.io/2014/11/15/breezedeus-feature-processing.html 请您移步原文观看,本文只供自己学习使用 连 ...
- Java-Shiro(五):Shiro Realm讲解(二)IniRealm的用法、JdbcRelam的用法、自定义Realm
引入 上一篇在讲解Realm简介时,介绍过Realm包含大概4类缺省的Realm,本章主要讲解: 1)IniRealm的用法: 2)JdbcRealm基于mysql 默认表及查询语句实现认证.授权 ...
- python_多线程多进程
多线程,适用于IO密集型任务 IO,input,output缩写,包括网路io(比如上传下载),磁盘io,(比如数据库读写),CPU操作不频繁 多进程,适用于CPU密集型任务 数据分析,算法,依赖CP ...
- marquee跑马灯效果的相关属性
介绍HTML设置滚动文字marquee的相关属性 ㈠文字滚动标签 设置文字滚动使用<marquee></marquee>标签,可以再标签里面设置字体的颜色,字号,字体大小等. ...