最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言O(shè)RM包中使用worm構(gòu)造查詢條件的實(shí)例詳解

 更新時(shí)間:2022年07月18日 14:22:31   作者:haming  
worm是一款方便易用的Go語(yǔ)言O(shè)RM庫(kù)。worm支Model方式(持結(jié)構(gòu)體字段映射)、原生SQL以及SQLBuilder三種模式來(lái)操作數(shù)據(jù)庫(kù),并且Model方式、原生SQL以及SQLBuilder可混合使用,本文通過(guò)一些例子來(lái)說(shuō)明如何使用worm來(lái)構(gòu)造查詢條件,感興趣的朋友一起看看吧

構(gòu)造查詢條件

worm是一款方便易用的Go語(yǔ)言O(shè)RM庫(kù)。worm支Model方式(持結(jié)構(gòu)體字段映射)、原生SQL以及SQLBuilder三種模式來(lái)操作數(shù)據(jù)庫(kù),并且Model方式、原生SQL以及SQLBuilder可混合使用。

Model方式、SQL builder支持鏈?zhǔn)紸PI,可使用Where, And, Or, ID, In, Limit, GroupBy, OrderBy, Having等函數(shù)構(gòu)造查詢條件。也可以可通過(guò)Join、LeftJoin、RightJoin來(lái)進(jìn)行數(shù)據(jù)庫(kù)表之間的關(guān)聯(lián)查詢。

本文通過(guò)一些例子來(lái)說(shuō)明如何使用worm來(lái)構(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)
}

說(shuō)明:

  • 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í)間,方便快速定位問(wèn)題。
  • 數(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"
}

說(shuō)明:

  • worm使用名稱為"db"的Tag映射數(shù)據(jù)庫(kù)字段,"db"后面是字段的名稱,autoincr用于說(shuō)明該字段是自增ID,n_update用于說(shuō)明該字段不可用于update語(yǔ)句中。

通過(guò)ID來(lái)查詢數(shù)據(jù)

若數(shù)據(jù)庫(kù)表存在 id 字段,則可以通過(guò)ID函數(shù)來(lái)查詢一條數(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

通過(guò)Where函數(shù)來(lái)查詢數(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>?

說(shuō)明:

  • 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ù)變量的值來(lái)判斷使用使用一個(gè)變量來(lái)作為查詢條件來(lái)查詢書庫(kù),例如,若用戶的姓名不為空時(shí)通過(guò)用戶姓名來(lái)查詢數(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ù))來(lái)支持這種查詢需求:

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
    }
}

說(shuō)明:

  • WhereIf函數(shù)的第一個(gè)參數(shù)時(shí)一個(gè)bool變量,若該變量為true,則會(huì)添加查詢條件,否則忽略該查詢條件。

in、not in查詢

worm提供了AndIn、AndNotIn、OrIn、OrNotIn函數(shù)來(lái)支持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
    }
}

說(shuō)明:

  • 若使用數(shù)組方式,則可變長(zhǎng)參數(shù)智能時(shí)一個(gè)參數(shù),并且該參數(shù)為數(shù)組類型。

嵌套查詢語(yǔ)句

worm支持嵌套查詢語(yǔ)句,例如查詢?yōu)椋?nbsp;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來(lái)查詢數(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

到此這篇關(guān)于Go語(yǔ)言O(shè)RM包中使用worm構(gòu)造查詢條件的文章就介紹到這了,更多相關(guān)Go語(yǔ)言O(shè)RM內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Golang如何調(diào)用Linux命令詳解

    利用Golang如何調(diào)用Linux命令詳解

    這篇文章主要給大家介紹了Golang中使用os/exec來(lái)執(zhí)行 Linux 命令的相關(guān)資料,文中給出了詳細(xì)的示例代碼,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-05-05
  • docker中部署golang項(xiàng)目的步驟詳解

    docker中部署golang項(xiàng)目的步驟詳解

    這篇文章主要給大家介紹了關(guān)于在docker中部署golang項(xiàng)目的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 深度解密 Go 語(yǔ)言中的 sync.map

    深度解密 Go 語(yǔ)言中的 sync.map

    這篇文章主要介紹了深度解密 Go 語(yǔ)言中的 sync.map,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Go設(shè)計(jì)模式之備忘錄模式圖文詳解

    Go設(shè)計(jì)模式之備忘錄模式圖文詳解

    備忘錄模式是一種行為設(shè)計(jì)模式, 允許在不暴露對(duì)象實(shí)現(xiàn)細(xì)節(jié)的情況下保存和恢復(fù)對(duì)象之前的狀態(tài),本文主要通過(guò)一些圖片來(lái)給大家介紹一下Go的備忘錄模式,需要的朋友可以參考下
    2023-08-08
  • k8s容器互聯(lián)flannel?vxlan通信原理

    k8s容器互聯(lián)flannel?vxlan通信原理

    這篇文章主要為大家介紹了k8s容器互聯(lián)flannel?vxlan通信原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Go語(yǔ)言開發(fā)技巧必知的小細(xì)節(jié)提升效率

    Go語(yǔ)言開發(fā)技巧必知的小細(xì)節(jié)提升效率

    這篇文章主要介紹了Go語(yǔ)言開發(fā)技巧必知的小細(xì)節(jié)提升效率,分享幾個(gè)你可能不知道的Go語(yǔ)言小細(xì)節(jié),希望能幫助大家更好地學(xué)習(xí)這門語(yǔ)言
    2024-01-01
  • Golang基于Vault實(shí)現(xiàn)敏感數(shù)據(jù)加解密

    Golang基于Vault實(shí)現(xiàn)敏感數(shù)據(jù)加解密

    數(shù)據(jù)加密是主要的數(shù)據(jù)安全防護(hù)技術(shù)之一,敏感數(shù)據(jù)應(yīng)該加密存儲(chǔ)在數(shù)據(jù)庫(kù)中,降低泄露風(fēng)險(xiǎn),本文將介紹一下利用Vault實(shí)現(xiàn)敏感數(shù)據(jù)加解密的方法,需要的可以參考一下
    2023-07-07
  • golang Gorm與數(shù)據(jù)庫(kù)完整性約束詳解

    golang Gorm與數(shù)據(jù)庫(kù)完整性約束詳解

    這篇文章主要介紹了golang Gorm與數(shù)據(jù)庫(kù)完整性約束詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Golang WebView跨平臺(tái)的桌面應(yīng)用庫(kù)的使用

    Golang WebView跨平臺(tái)的桌面應(yīng)用庫(kù)的使用

    Golang WebView是一個(gè)強(qiáng)大的桌面應(yīng)用庫(kù),本文介紹了Golang WebView的特點(diǎn)和使用方法,并列舉示例詳細(xì)的介紹了其在實(shí)際項(xiàng)目中的應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Go定時(shí)器的三種實(shí)現(xiàn)方式示例詳解

    Go定時(shí)器的三種實(shí)現(xiàn)方式示例詳解

    這篇文章主要為大家介紹了Go定時(shí)器的三種實(shí)現(xiàn)方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論

手游| 阳高县| 荆州市| 靖江市| 湟中县| 彩票| 辽阳市| 织金县| 德阳市| 四平市| 大足县| 四子王旗| 漾濞| 长子县| 河间市| 东至县| 兴城市| 张北县| 江北区| 桃园市| 陇南市| 博白县| 田林县| 大石桥市| 清河县| 和政县| 新绛县| 岗巴县| 株洲县| 措勤县| 新疆| 镇宁| 巩义市| 宜兰县| 林口县| 乡城县| 德钦县| 宿松县| 确山县| 长岭县| 定远县|