Go語(yǔ)言O(shè)RM框架構(gòu)造查詢條件示例詳解
構(gòu)造查詢條件
worm是一款方便易用的Go語(yǔ)言O(shè)RM庫(kù)。worm支Model方式(持結(jié)構(gòu)體字段映射)、原生SQL以及SQLBuilder三種模式來操作數(shù)據(jù)庫(kù),并且Model方式、原生SQL以及SQLBuilder可混合使用。
Model方式、SQL builder支持鏈?zhǔn)紸PI,可使用Where, And, Or, ID, In, Limit, GroupBy, OrderBy, Having等函數(shù)構(gòu)造查詢條件。也可以可通過Join、LeftJoin、RightJoin來進(jìn)行數(shù)據(jù)庫(kù)表之間的關(guān)聯(lián)查詢。
本文通過一些例子來說明如何使用worm來構(gòu)造查詢條件。
main函數(shù)
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
log "github.com/haming123/wego/dlog"
"github.com/haming123/wego/worm"
)
func mysql_open(cnnstr string) (*sql.DB, error) {
db, err := sql.Open("mysql", cnnstr)
if err != nil {
return nil, err
}
err = db.Ping()
if err != nil {
return nil, err
}
return db, nil
}
func main() {
//創(chuàng)建數(shù)據(jù)連接池
cnnstr := "user:passwd@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True"
db_cnn, err := mysql_open(cnnstr)
if err != nil {
log.Error(err)
return
}
//初始化ORM
worm.InitMysql(db_cnn)
//顯示SQL語(yǔ)句log
worm.ShowSqlLog(true)
}說明:
- worm代碼的下載
go get github.com/haming123/wego
- worm.ShowSqlLog
worm.ShowSqlLog用于控制sql日志的顯示,建議測(cè)試環(huán)境下打開sql日志的顯示的開關(guān),這樣可以看到每個(gè)數(shù)據(jù)庫(kù)操作的sql語(yǔ)句以及執(zhí)行時(shí)間,方便快速定位問題。
- 數(shù)據(jù)庫(kù)的支持
目前worm支持的數(shù)據(jù)庫(kù)有:mysql、postgres、sqlite、sqlserver, 本文的例子中采用了mysql數(shù)據(jù)庫(kù)。
數(shù)據(jù)庫(kù)表與數(shù)據(jù)模型
//建表語(yǔ)句 CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT NULL, `age` int(11) DEFAULT NULL, `passwd` varchar(32) DEFAULT NULL, `created` datetime DEFAULT NULL, PRIMARY KEY (`id`) );
數(shù)據(jù)庫(kù)表user對(duì)應(yīng)的實(shí)體類的定義如下:
type User struct {
Id int64 `db:"id;autoincr"`
Name string `db:"name"`
Age int64 `db:"age"`
Passwd string `db:"passwd"`
Created time.Time `db:"created;n_update"`
}
func (ent *User) TableName() string {
return "user"
}說明:
- worm使用名稱為"db"的Tag映射數(shù)據(jù)庫(kù)字段,"db"后面是字段的名稱,autoincr用于說明該字段是自增ID,n_update用于說明該字段不可用于update語(yǔ)句中。
通過ID來查詢數(shù)據(jù)
若數(shù)據(jù)庫(kù)表存在id字段,則可以通過ID函數(shù)來查詢一條數(shù)據(jù)據(jù)記錄:
func DemoGetById() {
var user model.User
_, err := worm.Model(&user).ID(1).Get()
if err != nil {
log.Error(err)
return
}
log.Debug(user)
}
//select id,name,age,passwd,created from user where id=? limit 1執(zhí)行該函數(shù)后的sql日志為:
[S] select id,name,age,passwd,created from user where id=1 limit 1 [S] DB: time=18.816ms
通過Where函數(shù)來查詢數(shù)據(jù)
Where函數(shù)的使用類似Sprintf函數(shù),函數(shù)的第一個(gè)參數(shù)是sql語(yǔ)句(where語(yǔ)句)模板,后面的參數(shù)是模板變量的值。
func DemoWhere() {
var users []model.User
err := worm.Model(&model.User{}).Where("id>? and age>?", 1, 10).Find(&users)
if err != nil {
log.Error(err)
return
}
}
//對(duì)應(yīng)的sql語(yǔ)句為:
//select id,name,age,passwd,created from user where id>? and age>?說明:
- worm占位符統(tǒng)一使用?,worm會(huì)根據(jù)數(shù)據(jù)庫(kù)類型,自動(dòng)替換占位符,例如postgresql數(shù)據(jù)庫(kù)把?替換成$1,$2...
- 可以在Where函數(shù)使用多個(gè)變量進(jìn)行查詢,這種方式比較直觀,與數(shù)據(jù)庫(kù)查詢中的sql語(yǔ)句的寫法比較類似。但是當(dāng)查詢條件比較多時(shí),建議使用And、OR函數(shù)進(jìn)行適當(dāng)?shù)姆指?,防止將查詢變量與變量的值對(duì)應(yīng)錯(cuò)誤。例如:
func DemoWhere2() {
var users []model.User
err := worm.Model(&model.User{}).Where("id>?", 1).And("age>?", 10).Find(&users)
if err != nil {
log.Error(err)
return
}
}
//對(duì)應(yīng)的sql語(yǔ)句為:
//select id,name,age,passwd,created from user where id>? and age>?like查詢的寫法
例如查詢用戶的姓名中包含:demo的數(shù)據(jù)庫(kù)記錄:
func DemoWhereLike() {
var users []model.User
err := worm.Model(&model.User{}).Where("name like ?", "%demo%").Find(&users)
if err != nil {
log.Error(err)
return
}
}
//對(duì)應(yīng)的sql語(yǔ)句為:
//select id,name,age,passwd,created from user where name like '%demo%'XXXIf查詢
有些情況加我們會(huì)根據(jù)變量的值來判斷使用使用一個(gè)變量來作為查詢條件來查詢書庫(kù),例如,若用戶的姓名不為空時(shí)通過用戶姓名來查詢數(shù)據(jù)庫(kù)。常規(guī)的寫法如下:
func DemoWhereIf(name string) {
var users []model.User
var err error
if name == "" {
err = worm.Model(&model.User{}).Find(&users)
} else {
err = worm.Model(&model.User{}).Where("name=?", name).Find(&users)
}
if err != nil {
log.Error(err)
return
}
}worm提供了更為簡(jiǎn)單的方法(提供了WhereIf、AndIf、OrIf函數(shù))來支持這種查詢需求:
func DemoWhereIf(name string) {
var users []model.User
err := worm.Model(&model.User{}).WhereIf(name != "", "name=?", name).Find(&users)
if err != nil {
log.Error(err)
return
}
}說明:
- WhereIf函數(shù)的第一個(gè)參數(shù)時(shí)一個(gè)bool變量,若該變量為true,則會(huì)添加查詢條件,否則忽略該查詢條件。
in、not in查詢
worm提供了AndIn、AndNotIn、OrIn、OrNotIn函數(shù)來支持sql語(yǔ)句中的in、not in查詢。例如:
func DemoWhereIn() {
var users []model.User
err := worm.Model(&model.User{}).Where("").AndIn("id", 11, 12, 13, 14).Find(&users)
if err != nil {
log.Error(err)
return
}
}
//對(duì)應(yīng)的sql語(yǔ)句為:
select id,name,age,passwd,created from user where id in (?,?,?,?)XXXIn、XXXNotIn的第二個(gè)參數(shù)時(shí)一個(gè)變長(zhǎng)參數(shù),您可以將需要查詢的值作為變長(zhǎng)參數(shù)傳入,也可以將查詢的值放到一個(gè)數(shù)組中進(jìn)行查詢:
func DemoWhereIn() {
var users []model.User
arr_id := []int64{11, 12, 13, 14}
err := worm.Model(&model.User{}).Where("").AndIn("id", arr_id).Find(&users)
if err != nil {
log.Error(err)
return
}
}說明:
- 若使用數(shù)組方式,則可變長(zhǎng)參數(shù)智能時(shí)一個(gè)參數(shù),并且該參數(shù)為數(shù)組類型。
嵌套查詢語(yǔ)句
worm支持嵌套查詢語(yǔ)句,例如查詢?yōu)椋?code>age>10 and (name='demo1' or name='demo2'), 則使用worm的方式如下:
func DemoWhereExp() {
var users []model.User
sqlw := worm.SQLW("name=?", "demo1").Or("name=?", "demo2")
err := worm.Model(&model.User{}).Where("age>?", 10).AndExp(sqlw).Find(&users)
if err != nil {
log.Error(err)
return
}
}
//對(duì)應(yīng)的sql語(yǔ)句為:
//select id,name,age,passwd,created from user where age>? and (name=? or name=?)Limit與Offset
在MySQL語(yǔ)句中可以使用Limit與Offset來查詢數(shù)據(jù)庫(kù),這種查詢通常用于WEB的分頁(yè)查詢中。
worm也支持mysql的Limit與Offset語(yǔ)句:
func DemoQueryPage(plen int64, pcur int64) {
var users []model.User
err := worm.Model(&model.User{}).Where("age>?", 10).Limit(plen).Offset(plen * pcur).Find(&users)
if err != nil {
log.Error(err)
return
}
}
//對(duì)應(yīng)的sql語(yǔ)句為:
//select id,name,age,passwd,created from user where age>? limit ?, ?orderby查詢
OrderBy函數(shù)對(duì)應(yīng)sql語(yǔ)句中的order by語(yǔ)句:
func DemoQueryOrderBy(orderby string) {
var users []model.User
err := worm.Model(&model.User{}).Where("age>?", 10).OrderBy(orderby).Find(&users)
if err != nil {
log.Error(err)
return
}
}
//對(duì)應(yīng)的sql語(yǔ)句為:
//select id,name,age,passwd,created from user where age>? order by created desc以上就是Go語(yǔ)言O(shè)RM框架構(gòu)造查詢條件示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go ORM構(gòu)造查詢條件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言基礎(chǔ)if條件語(yǔ)句用法及示例詳解
golang gopm get -g -v 無法獲取第三方庫(kù)的解決方案
使用Golang獲取音視頻時(shí)長(zhǎng)信息的示例代碼
go語(yǔ)言通過管道連接兩個(gè)命令行進(jìn)程的方法
go語(yǔ)言單元測(cè)試基準(zhǔn)測(cè)試及表驅(qū)動(dòng)測(cè)試示例詳解
Go語(yǔ)言題解LeetCode1051高度檢查器示例詳解

