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-sqlitebeego-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 stringPort stringDatabase stringUsername stringPassword stringMaxIdleConns 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 serviceimport ("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()//初始化ormreturn 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 = trueo := orm.NewOrm()var users = new(User)//注意使用new来创建变量,否则就会报错users.Id = idfmt.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 = trueo := 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 intPageSize intTotalPage intTotalCount intFirstPage boolLastPage boolList interface{}}func PageUtil(count int, pageNo int, pageSize int, list interface{}) Page {tp := count / pageSizeif 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=pageSizepage.List=userfmt.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 stringAge 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放在一 ...
随机推荐
- supdf
https://github.com/sumatrapdfreader/sumatrapdf/tree/master/src c++ java
- npm安装node-sass报msbuild相关错误的解决办法
转自:https://blog.csdn.net/Amio_/article/details/87931733 https://www.cnblogs.com/diffx/p/10510868.htm ...
- string::erase
sequence (1) string& erase (size_t pos = 0, size_t len = npos);两个参数都有默认值,传递的唯一参数匹配第一个 character ...
- python3 百度AI-v3之 人脸对比 & 人脸检测 & 在线活体检测 接口
#!/usr/bin/python3 # 百度人脸对比 & 人脸检测api-v3 import sys, tkinter.messagebox, ast import ssl, json,re ...
- XXL-JOB原理--任务调度中心任务管理
XXL-JOB原理--任务调度中心任务管理 https://blog.csdn.net/qq924862077/article/details/82713758
- 查看Spring MVC 父容器和子容器的对象的实例
话不多说,直接上案例 package com.oukele.web; import org.springframework.beans.factory.annotation.Autowired; im ...
- MySQL user表初始化
默认安装的MySQL数据库,无法远程连接. 登录MySQL之后,运行 SELECT user,host from mysql.user; 如果只有一条记录,说明是这个原因. 将下面的脚本保存成user ...
- select添加皮肤 jquery
由于select修改样式不能兼容浏览器,也不能随意修改,那么就需要模拟select,给select添加皮肤了,代码如下 <!DOCTYPE html> <html lang=&quo ...
- Redis常用数据类型底层数据结构分析
Redis是一种键值(key-Value)数据库,相对于关系型数据库,它也被叫作非关系型数据库 Redis中,键的数据类型是字符串,但是为了非富数据存储方式,方便开发者使用,值的数据类型有很多 字符串 ...
- pdf转换
namespace Utilities { public static class PDFHelper { /// <summary> /// Html转Pdf /// </summ ...