<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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來進行資料庫表之間的關聯查詢。
本文通過一些例子來說明如何使用worm來構造查詢條件。
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) }
說明:
//建表語句 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" }
說明:
若資料庫表存在 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>?
說明:
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>?
例如查詢使用者的姓名中包含: 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 } }
說明:
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包中使用worm構造查詢條件的文章就介紹到這了,更多相關Go語言ORM內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45