一、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}]
