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. 介绍知道的http返回的状态码

    100    Continue    继续.客户端应继续其请求 101    Switching Protocols    切换协议.服务器根据客户端的请求切换协议.只能切换到更高级的协议,例如,切换 ...

  2. C# 各个版本特性总结

    历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECM ...

  3. BZOJ3555 [Ctsc2014]企鹅QQ[暴力+字符串hash]

    菜到自闭,一道省选小水题都能给我做繁. 要求有一位不同,则对每个串每一位暴力枚举把这一位删掉,放一个分隔符,算一下hash,插表,相似的都应该会被插入同一个桶.最后把hash统计一下即可.复杂度$O( ...

  4. 构建的Web应用界面还不够好看?DevExtreme v19.1全新主题来袭

    行业领先的.NET界面控件DevExpress 正式发布了v19.1版本,本文将主要介绍介绍DevExtremev19.1中的数据可视化和主题控件,其中主要包含图表注释.增强图例功能等.欢迎下载v19 ...

  5. fedora29 安装mongodb 4.0,6问题记录

    如果运行mongod命令时提示 无加载共享库libcrypto.so.10,那就到页面下载http://www.rpmfind.net/linux/rpm2html/search.php?query= ...

  6. JavaScript 函数调用时带括号和不带括号的区别

    function countBodyChildren(){ var body_element = document.getElementsByTagName("body")[0]; ...

  7. jsp九大内置对象及四个作用域【转】

    1.Request对象 该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息,即使用该对象可以 获取用户提交的信息. 当Request对象获取客户提交的汉字字符时,会出现乱码问题,必 ...

  8. yum 源的搭建

    repos和epel的关系 https://blog.csdn.net/fantaxy025025/article/details/84918199 配置阿里云的yum源 https://www.cn ...

  9. hexdump命令

    hexdump hexdump用于以16进制.10进制.8进制.ascii码形式打印文件内容,也可以是标准输入的内容. 用法 hexdump [选项] 文件 ... 选项 选项 参数 说明 -b   ...

  10. UVA 10900 So do you want to be a 2^n-aire?

    #include<bits/stdc++.h> #include<stdio.h> #include<iostream> #include<cmath> ...