您好,登錄后才能下訂單哦!
這篇文章主要介紹了Go語言中怎么使用ORM框架構造查詢條件的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Go語言中怎么使用ORM框架構造查詢條件文章都會有所收獲,下面我們一起來看看吧。
worm是一款方便易用的Go語言ORM庫。worm支Model方式(持結構體字段映射)、原生SQL以及SQLBuilder三種模式來操作數據庫,并且Model方式、原生SQL以及SQLBuilder可混合使用。
Model方式、SQL builder支持鏈式API,可使用Where, And, Or, ID, In, Limit, GroupBy, OrderBy, Having等函數構造查詢條件。也可以可通過Join、LeftJoin、RightJoin來進行數據庫表之間的關聯查詢。
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() { //創建數據連接池 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語句log worm.ShowSqlLog(true) }
說明:
worm.ShowSqlLog用于控制sql日志的顯示,建議測試環境下打開sql日志的顯示的開關,這樣可以看到每個數據庫操作的sql語句以及執行時間,方便快速定位問題。
數據庫的支持
目前worm支持的數據庫有:mysql、postgres、sqlite、sqlserver, 本文的例子中采用了mysql數據庫。
//建表語句 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`) );
數據庫表user對應的實體類的定義如下:
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映射數據庫字段,"db"后面是字段的名稱,autoincr用于說明該字段是自增ID,n_update用于說明該字段不可用于update語句中。
若數據庫表存在id
字段,則可以通過ID函數來查詢一條數據據記錄:
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
執行該函數后的sql日志為:
[S] select id,name,age,passwd,created from user where id=1 limit 1 [S] DB: time=18.816ms
Where函數的使用類似Sprintf函數,函數的第一個參數是sql語句(where語句)模板,后面的參數是模板變量的值。
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 } } //對應的sql語句為: //select id,name,age,passwd,created from user where id>? and age>?
說明:
worm占位符統一使用?,worm會根據數據庫類型,自動替換占位符,例如postgresql數據庫把?替換成$1,$2...
可以在Where函數使用多個變量進行查詢,這種方式比較直觀,與數據庫查詢中的sql語句的寫法比較類似。但是當查詢條件比較多時,建議使用And、OR函數進行適當的分割,防止將查詢變量與變量的值對應錯誤。例如:
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 } } //對應的sql語句為: //select id,name,age,passwd,created from user where id>? and age>?
like查詢的寫法
例如查詢用戶的姓名中包含:demo
的數據庫記錄:
func DemoWhereLike() { var users []model.User err := worm.Model(&model.User{}).Where("name like ?", "%demo%").Find(&users) if err != nil { log.Error(err) return } } //對應的sql語句為: //select id,name,age,passwd,created from user where name like '%demo%'
有些情況加我們會根據變量的值來判斷使用使用一個變量來作為查詢條件來查詢書庫,例如,若用戶的姓名不為空時通過用戶姓名來查詢數據庫。常規的寫法如下:
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提供了更為簡單的方法(提供了WhereIf、AndIf、OrIf函數)來支持這種查詢需求:
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函數的第一個參數時一個bool變量,若該變量為true,則會添加查詢條件,否則忽略該查詢條件。
worm提供了AndIn、AndNotIn、OrIn、OrNotIn函數來支持sql語句中的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 } } //對應的sql語句為: select id,name,age,passwd,created from user where id in (?,?,?,?)
XXXIn、XXXNotIn的第二個參數時一個變長參數,您可以將需要查詢的值作為變長參數傳入,也可以將查詢的值放到一個數組中進行查詢:
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 } }
說明:
若使用數組方式,則可變長參數智能時一個參數,并且該參數為數組類型。
worm支持嵌套查詢語句,例如查詢為: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 } } //對應的sql語句為: //select id,name,age,passwd,created from user where age>? and (name=? or name=?)
在MySQL語句中可以使用Limit與Offset來查詢數據庫,這種查詢通常用于WEB的分頁查詢中。
worm也支持mysql的Limit與Offset語句:
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 } } //對應的sql語句為: //select id,name,age,passwd,created from user where age>? limit ?, ?
OrderBy函數對應sql語句中的order by語句:
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 } } //對應的sql語句為: //select id,name,age,passwd,created from user where age>? order by created desc
關于“Go語言中怎么使用ORM框架構造查詢條件”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Go語言中怎么使用ORM框架構造查詢條件”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。