欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言O(shè)RM框架構(gòu)造查詢條件示例詳解

 更新時間:2022年12月20日 17:03:48   作者:haming  
這篇文章主要為大家介紹了Go語言O(shè)RM框架構(gòu)造查詢條件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

構(gòu)造查詢條件

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

Model方式、SQL builder支持鏈式API,可使用Where, And, Or, ID, In, Limit, GroupBy, OrderBy, Having等函數(shù)構(gòu)造查詢條件。也可以可通過Join、LeftJoin、RightJoin來進行數(shù)據(jù)庫表之間的關(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語句log
    worm.ShowSqlLog(true)
}

說明:

  • worm代碼的下載

go get github.com/haming123/wego

  • worm.ShowSqlLog

worm.ShowSqlLog用于控制sql日志的顯示,建議測試環(huán)境下打開sql日志的顯示的開關(guān),這樣可以看到每個數(shù)據(jù)庫操作的sql語句以及執(zhí)行時間,方便快速定位問題。

  • 數(shù)據(jù)庫的支持

目前worm支持的數(shù)據(jù)庫有:mysql、postgres、sqlite、sqlserver, 本文的例子中采用了mysql數(shù)據(jù)庫。

數(shù)據(jù)庫表與數(shù)據(jù)模型

//建表語句
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ù)庫表user對應(yīng)的實體類的定義如下:

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ù)庫字段,"db"后面是字段的名稱,autoincr用于說明該字段是自增ID,n_update用于說明該字段不可用于update語句中。

通過ID來查詢數(shù)據(jù)

若數(shù)據(jù)庫表存在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ù)的第一個參數(shù)是sql語句(where語句)模板,后面的參數(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
    }
}
//對應(yīng)的sql語句為:
//select id,name,age,passwd,created from user where id>? and age>?

說明:

  • worm占位符統(tǒng)一使用?,worm會根據(jù)數(shù)據(jù)庫類型,自動替換占位符,例如postgresql數(shù)據(jù)庫把?替換成$1,$2...
  • 可以在Where函數(shù)使用多個變量進行查詢,這種方式比較直觀,與數(shù)據(jù)庫查詢中的sql語句的寫法比較類似。但是當查詢條件比較多時,建議使用And、OR函數(shù)進行適當?shù)姆指?,防止將查詢變量與變量的值對應(yīng)錯誤。例如:
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
    }
}
//對應(yīng)的sql語句為:
//select id,name,age,passwd,created from user where id>? and age>?

like查詢的寫法
例如查詢用戶的姓名中包含:demo的數(shù)據(jù)庫記錄:

func DemoWhereLike() {
  var users []model.User
  err := worm.Model(&model.User{}).Where("name like ?", "%demo%").Find(&users)
  if err != nil {
      log.Error(err)
      return
  }
}
//對應(yīng)的sql語句為:
//select id,name,age,passwd,created from user where name like '%demo%'

XXXIf查詢

有些情況加我們會根據(jù)變量的值來判斷使用使用一個變量來作為查詢條件來查詢書庫,例如,若用戶的姓名不為空時通過用戶姓名來查詢數(shù)據(jù)庫。常規(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提供了更為簡單的方法(提供了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ù)的第一個參數(shù)時一個bool變量,若該變量為true,則會添加查詢條件,否則忽略該查詢條件。

in、not in查詢

worm提供了AndIn、AndNotIn、OrIn、OrNotIn函數(shù)來支持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
    }
}
//對應(yīng)的sql語句為:
select id,name,age,passwd,created from user where id in (?,?,?,?)

XXXIn、XXXNotIn的第二個參數(shù)時一個變長參數(shù),您可以將需要查詢的值作為變長參數(shù)傳入,也可以將查詢的值放到一個數(shù)組中進行查詢:

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ù)組方式,則可變長參數(shù)智能時一個參數(shù),并且該參數(shù)為數(shù)組類型。

嵌套查詢語句

worm支持嵌套查詢語句,例如查詢?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
    }
}
//對應(yīng)的sql語句為:
//select id,name,age,passwd,created from user where age>? and (name=? or name=?)

Limit與Offset

在MySQL語句中可以使用Limit與Offset來查詢數(shù)據(jù)庫,這種查詢通常用于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
    }
}
//對應(yīng)的sql語句為:
//select id,name,age,passwd,created from user where age>? limit ?, ?

orderby查詢

OrderBy函數(shù)對應(yīng)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
    }
}
//對應(yīng)的sql語句為:
//select id,name,age,passwd,created from user where age>? order by created desc

以上就是Go語言O(shè)RM框架構(gòu)造查詢條件示例詳解的詳細內(nèi)容,更多關(guān)于Go ORM構(gòu)造查詢條件的資料請關(guān)注腳本之家其它相關(guān)文章!

  • Go語言基礎(chǔ)if條件語句用法及示例詳解

    Go語言基礎(chǔ)if條件語句用法及示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)if條件語句的用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-11-11
  • Go語言中的變量聲明和賦值

    Go語言中的變量聲明和賦值

    這篇文章主要介紹了Go語言中的變量聲明和賦值的方法,十分的細致全面,有需要的小伙伴可以參考下。
    2015-04-04
  • golang gopm get -g -v 無法獲取第三方庫的解決方案

    golang gopm get -g -v 無法獲取第三方庫的解決方案

    這篇文章主要介紹了golang gopm get -g -v 無法獲取第三方庫的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Golang中關(guān)于defer的盲區(qū)梳理

    Golang中關(guān)于defer的盲區(qū)梳理

    關(guān)于Go中的defer,是做什么的?執(zhí)行順序是怎么樣的?相信學(xué)過Go語言的同學(xué),已經(jīng)不在陌生,今天就來講講其中需要掌握的幾個知識點,希望對大家有所幫助
    2023-03-03
  • 使用Golang獲取音視頻時長信息的示例代碼

    使用Golang獲取音視頻時長信息的示例代碼

    這篇文章主要介紹了如何使用Golang獲取音視頻時長信息,文中通過代碼示例講解的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • go語言通過管道連接兩個命令行進程的方法

    go語言通過管道連接兩個命令行進程的方法

    這篇文章主要介紹了go語言通過管道連接兩個命令行進程的方法,實例分析了Go語言操作命令行進程的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • go語言單元測試基準測試及表驅(qū)動測試示例詳解

    go語言單元測試基準測試及表驅(qū)動測試示例詳解

    這篇文章主要為大家介紹了go語言單元測試基準測試及表驅(qū)動測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Go語言題解LeetCode1051高度檢查器示例詳解

    Go語言題解LeetCode1051高度檢查器示例詳解

    這篇文章主要為大家介紹了Go語言題解LeetCode1051高度檢查器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Go語言中字符串拼接的方法總結(jié)

    Go語言中字符串拼接的方法總結(jié)

    在Go語言中,我們可以使用+操作符、bytes.Buffer、strings.Builder等方法來拼接字符串,本文主要為大家介紹了這些常用方法的實現(xiàn)以及性能對比,感興趣的小伙伴可以了解下
    2023-11-11
  • 最新評論