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