一、model设计构造查询

QueryBuilder 提供了一个简便,流畅的 SQL 查询构造器。在不影响代码可读性的前提下用来快速的建立 SQL 语句。

QueryBuilder 在功能上与 ORM 重合, 但是各有利弊。ORM 更适用于简单的 CRUD 操作,而 QueryBuilder 则更适用于复杂的查询,例如查询中包含子查询和多重联结。

1、model设计构造查询

示例:

// 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)

 

2、通过构建查询操作数据库

示例1:

mysql数据库

mysql> select * from user_info;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | nulige | 123456 |
+----+----------+----------+
1 row in set (0.00 sec)

示例:

routers/router.go

package routers

import (
"web/controllers" "github.com/astaxie/beego"
) func init() {
beego.Router("/", &controllers.MainController{})
beego.Router("/test_input", &controllers.TestInputController{}, "get:Get;post:Post")
beego.Router("/test_model", &controllers.TestModelController{}, "get:Get;post:Post")
} 
controllers/testModel.go
package controllers

import (
"fmt" "github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
) //由于model这个名字叫 UserInfo 那么操作的表其实 user_info
type UserInfo struct {
Id int64
Username string
Password string
} type TestModelController struct {
beego.Controller
} func (c *TestModelController) Get() {
orm.Debug = true // 是否开启调试模式 调试模式下会打印出sql语句
orm.RegisterDataBase("default", "mysql", "root:qwe!23@tcp(127.0.0.1:3306)/test?charset=utf8", 30)
orm.RegisterModel(new(UserInfo)) o := orm.NewOrm() //构建查询
//采用QueryBuilder方式
var users []UserInfo
qb, _ := orm.NewQueryBuilder("mysql")
qb.Select("password").From("user_info").Where("username= ?").Limit(1) sql := qb.String()
o.Raw(sql, "nulige").QueryRows(&users) c.Ctx.WriteString(fmt.Sprintf("user info:%v", users))
}

执行结果:

http://127.0.0.1:8080/test_model

返回结果:

user info:[{0  123456}] 

3、完整的API接口

type QueryBuilder interface {
Select(fields ...string) QueryBuilder
From(tables ...string) QueryBuilder
InnerJoin(table string) QueryBuilder
LeftJoin(table string) QueryBuilder
RightJoin(table string) QueryBuilder
On(cond string) QueryBuilder
Where(cond string) QueryBuilder
And(cond string) QueryBuilder
Or(cond string) QueryBuilder
In(vals ...string) QueryBuilder
OrderBy(fields ...string) QueryBuilder
Asc() QueryBuilder
Desc() QueryBuilder
Limit(limit int) QueryBuilder
Offset(offset int) QueryBuilder
GroupBy(fields ...string) QueryBuilder
Having(cond string) QueryBuilder
Subquery(sub string, alias string) string
String() string
}

  

示例:

示例1:

mysql数据库

mysql> select * from user_info;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | nulige | 123456 |
+----+----------+----------+
1 row in set (0.00 sec)

示例:

routers/router.go

package routers

import (
"web/controllers" "github.com/astaxie/beego"
) func init() {
beego.Router("/", &controllers.MainController{})
beego.Router("/test_input", &controllers.TestInputController{}, "get:Get;post:Post")
beego.Router("/test_model", &controllers.TestModelController{}, "get:Get;post:Post")
} 
controllers/testModel.go
package controllers

import (
"fmt" "github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
) //由于model这个名字叫 UserInfo 那么操作的表其实 user_info
type UserInfo struct {
Id int64
Username string
Password string
} type TestModelController struct {
beego.Controller
} func (c *TestModelController) Get() {
orm.Debug = true // 是否开启调试模式 调试模式下会打印出sql语句
orm.RegisterDataBase("default", "mysql", "root:qwe!23@tcp(127.0.0.1:3306)/test?charset=utf8", 30)
orm.RegisterModel(new(UserInfo)) o := orm.NewOrm() var users []UserInfo
qb, _ := orm.NewQueryBuilder("mysql")
qb.Select("password").From("user_info").Where("username= 'nulige'").And("id=1").Limit(1) sql := qb.String()
o.Raw(sql).QueryRows(&users)
c.Ctx.WriteString(fmt.Sprintf("user info:%v", users))
}

执行结果:

http://127.0.0.1:8080/test_model

返回结果:

user info:[{0  123456}] 

 

Go语言之高级篇beego框架之model设计构造查询的更多相关文章

  1. Go语言之高级篇beego框架安装与使用

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

  2. Go语言之高级篇beego框架之layui框架应用

    1.layui前端框架 参考地址:https://www.layui.com

  3. Go语言之高级篇beego框架之配置beego环境

    1.配置beego环境 进入部署目录中 软件部署目录: 把要部署的软件代码,放在src目录下面. 启动项目

  4. Go语言之高级篇Beego框架之爬虫项目实战

    一.爬虫项目 1.爬虫基础 a.网页上面会有相同的数据 b.去重处理 布隆过滤器哈希存储 c.标签匹配: 正则表达式beautiful soup或lxml这种标签提取库 d.动态内容 phantomj ...

  5. Go语言之高级篇beego框架之config、httplib、context

    一.httplib 1.配置文件解析 这是一个用来解析文件的库,它的设计思路来自于 database/sql,目前支持解析的文件格式有 ini.json.xml.yaml,可以通过如下方式进行安装: ...

  6. Go语言之高级篇beego框架之view

    1.基本语法 go统一使用了{{ 和 }}作为左右标签,没有其它的标签符号. 如果你想要修改为其它符号,可以修改配置文件. 使用.来访问当前位置的上下文 使用$来引用当前模板根级的上下文 2.使用方法 ...

  7. Go语言之高级篇beego框架之controller调用model

    一.controller调用model 开发规范,就该把对数据库的操作写在model文件夹中. 示例: views/main.go package main import ( _ "web/ ...

  8. Go语言之高级篇beego框架之模型(Models)

    一.模型(Models) 1.beego-orm的相关特性 支持 Go 的所有类型存储 -轻松上手,采用简单的 CRUD 风格 -自动 Join 关联表 跨数据库兼容查询 允许直接使用 SQL 查询/ ...

  9. Go语言之高级篇beego框架之cookie与session

    1.cookie的用法 this.Ctx.SetCookie("name", name, maxage, "/") this.Ctx.SetCookie(&qu ...

随机推荐

  1. 纯 Java 开发 WebService 调用测试工具(wsCaller.jar)

    注:本文来自hacpai.com:Tanken的<纯 Java 开发 WebService 调用测试工具(wsCaller.jar)>的文章 基于 Java 开发的 WebService ...

  2. 前端开发必须知道的JS(一) 原型和继承

    原型和闭包是Js语言的难点,此文主要讲原型及原型实现的继承,在(二)中会讲下闭包,希望对大家有所帮助.若有疑问或不正之处,欢迎提出指正和讨论. 一. 原型与构造函数 Js所有的函数都有一个protot ...

  3. Keepalived详解之 - LVS(IPVS)管理工具ipvsadm使用指南

    ipvsadm是什么? ipvsadm是用来配置.维护或者查看Linux内核当中virtual server table的一个工具, LVS(Linux virtual server)能基于一个集群当 ...

  4. Linear Algebra(未完待续)

    [矩阵消元] The result of multiplying a matrix by some vector is a combination of the columns of the matr ...

  5. 【splunk】一些查询例子

    最重要资料: 入门基础:http://docs.splunk.com/Documentation/Splunk/6.5.2/SearchTutorial/WelcometotheSearchTutor ...

  6. python 全栈开发,Day59(小米商城)

    一.小米商城 准备工作: 访问iconfont,官网链接: http://www.iconfont.cn/ 登录之后,找到需要的图标 将图标下载到本地,解压,重命名为font创建几个空文件夹:css, ...

  7. python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)

    先来回顾一下昨天的内容 网络编程开发架构 B/S C/S架构网卡 mac地址网段 ip地址 : 表示了一台电脑在网络中的位置 子网掩码 : ip和子网掩码按位与得到网段 网关ip : 内置在路由器中的 ...

  8. python 全栈开发,Day19(组合,组合实例,初识面向对象小结,初识继承)

    一.组合 表示的一种什么有什么的关系 先来说一下,__init__的作用 class Dog: def __init__(self, name, kind, hp, ad): self.name = ...

  9. k8s单机部署1.11.5

    一.概述 由于服务器有限,因此只能用虚拟机搭建 k8s.但是开3个节点,电脑卡的不行. k8s中文社区封装了一个 Minikube,用来搭建单机版,链接如下: https://yq.aliyun.co ...

  10. select 禁止 选择

    禁止select控件選擇 大家知道, 對於HTML控件select, 是沒有readOnly屬性的,所以設置它並不起作用,如: <select id="select1" re ...