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的使用的更多相关文章

  1. Beego框架学习--(核心:数据交互)

    Beego框架学习记录 1.beego简介 beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计 ...

  2. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  3. Beego框架学习---layout的使用

    Beego框架学习---layout的使用 在管理系统中,管理菜单的界面是固定的,会变化的只是中间的部分.我就在想,是不是跟angular的"组件模块的router-outlet一样&quo ...

  4. beego框架学习--beego orm映射

    什么是ORM 即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作 ...

  5. Beego 框架学习(一)

    Beego官网本身已经整理的非常详细了,但是作为一个学习者,我还是决定自己好好整理一下,这样在后面使用的时候自己对每部分才能非常熟悉,及时忘记了,也可以迅速定位自己要用的知识在哪里.当然也是对官网的一 ...

  6. Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..

    PS:踏踏实实走好每一步... 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现 ...

  7. Beego 框架学习(一)

    1.特性 beego是一个http框架 高性能,是目前最快的的go框架 开发快捷,组件多,高度解耦 RESTful方式,可以自定义action 文档完整 智能路由.智能监控 2.安装 go get g ...

  8. beego框架学习(二) -路由设置

    路由设置 什么是路由设置呢?前面介绍的 MVC 结构执行时,介绍过 beego 存在三种方式的路由:固定路由.正则路由.自动路由,接下来详细的讲解如何使用这三种路由. 基础路由 从beego1.2版本 ...

  9. python flask框架学习(三)——豆瓣微信小程序案例(二)整理封装block,模板的继承

    我们所要实现的效果: 点击电影的更多,跳转到更多的电影页面:点击电视剧的更多,跳转到更多的电视剧页面. 三个页面的风格相同,可以设置一个模板,三个页面都继承这个模板 1.在指定模板之前,把css放在一 ...

随机推荐

  1. POJ2449 K短路模板

    #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> ...

  2. Vue多页面 按钮级别权限控制 directive指令控制

    利用driective 构建自己的指令,实现按钮级别权限 项目结构如下: 修改router.js { path: 'schools', name: '列表', component: () => ...

  3. HihoCoder1076 与链(数位DP)

    时间限制:24000ms 单点时限:3000ms 内存限制:256MB 描述 给定 n 和 k.计算有多少长度为 k 的数组 a1, a2, ..., ak,(0≤ai) 满足: a1 + a2 +  ...

  4. Linux知识点(二)

    1 df 查看磁盘空间使用情况 df: disk free 空余硬盘 1.基本语法 df  项 (功描能述:列出文件系统的整体磁盘使用量,检查文件系统的磁盘空间占用情况)选 2.选项说明 选项 功能 ...

  5. 使用 Capistrano 部署总结

    使用 Capistrano 部署总结 2014年6月27日 admin发表评论阅读评论 简介 Capistrano 是一个 Ruby 程序,它提供高级的工具集来部署你的 Web应用到服务器上.Capi ...

  6. 测试网站接口,nginx篇

    nginx是反向代理,怎么通过nginx反向代理要测试接口的线上网站呢. 这里自我提供了一个方法,仅供参考!建议不要用于刷接口等非常规的用途,后果会很严重. 首先 用node express创建一个项 ...

  7. Huber loss<转发>

    from https://blog.csdn.net/lanchunhui/article/details/50427055请移步原文

  8. javascript中继承方式及优缺点(一)

    分别介绍原型链继承.call/apply继承(借用构造函数继承).组合继承.原型式继承.寄生式继承.寄生组合式继承 1. 原型链继承 核心:将父类的实例作为子类的原型 function SuperTy ...

  9. 函数返回指针类型(strchr函数)

    #include<stdio.h> #include<string.h> char *mystrchr(char *s,char c) { while(*s) { if(*s ...

  10. LeetCode 141、142环形链表

    141题: 首先,先看141题,这个题是比较初级也是比较经典的环形链表题: 给定一个链表,判断链表中是否有环. 进阶:你能否不使用额外空间解决此题? 那么,什么是有环的链表呢: 这个就是有环的链表 题 ...