第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用 SET 變量進(jìn)行 MySQL 查詢

使用 SET 變量進(jìn)行 MySQL 查詢

Go
MMMHUHU 2023-02-06 19:03:16
我試圖通過(guò)設(shè)置一些變量來(lái)清理 Go 調(diào)用 MySQL 查詢的方式,然后再使用圍繞單個(gè)值的大量 case 語(yǔ)句運(yùn)行查詢。我嘗試運(yùn)行的查詢?cè)诳刂婆_(tái)上運(yùn)行良好,但在SELECT通過(guò) Go 運(yùn)行它時(shí)因語(yǔ)法問(wèn)題而失敗。這樣的事情可能嗎?func (d *DB) SelectByUserId(uid string, srt string, pg, lim int) ([]Inventory, error) {    query := `    SET @user_id := ?,        @orderBy := ?;    SELECT        *    FROM        inventory    WHERE        user_id = @user_id    ORDER BY        (CASE WHEN @orderBy = 'type,asc' THEN type END),        (CASE WHEN @orderBy = 'type,desc' THEN type END) DESC,        (CASE WHEN @orderBy = 'visible,asc' THEN visible END),        (CASE WHEN @orderBy = 'visible,desc' THEN visible END) DESC,        (CASE WHEN @orderBy = 'create_date,asc' THEN create_date END),        (CASE WHEN @orderBy = 'create_date,desc' THEN create_date END) DESC,        (CASE WHEN @orderBy = 'update_date,asc' THEN update_date END),        (CASE WHEN @orderBy = 'update_date,desc' THEN update_date END) DESC    LIMIT ?,?;    `        rows, err := d.Query(        query,        uid,        srt,        pg*lim,        lim,    )    if err != nil {        return nil, err    }    defer rows.Close()    result := make([]Inventory, 0)    for rows.Next() {        var inv Inventory        if err := rows.Scan(            &inv.Id,            &inv.UserId,            &inv.Type,            &inv.Name,            &inv.Description,            &inv.Visible,            &inv.CreateDate,            &inv.UpdateDate); err != nil {            return result, err        }        result = append(result, inv)    }    if err = rows.Err(); err != nil {        return result, err    }    return result, nil}現(xiàn)在,如果我取出 SET 部分并將所有@變量替換為?,然后srt像下面這樣多次傳遞變量,這一切都有效。但真的不想有查詢調(diào)用,例如:rows, err := d.Query(        query,        uid,        srt,        srt,        srt,        srt,        srt,        srt,        srt,        srt,        pg*lim,        lim)
查看完整描述

3 回答

?
PIPIONE

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊

對(duì)于那些感興趣的人,我已經(jīng)通過(guò)一些更新解決了我的問(wèn)題。

  1. 連接時(shí)在DSN上有設(shè)置?...&multiStatements=true&interpolateParams=true

  2. 添加以上內(nèi)容后,我開(kāi)始收到有關(guān)排序規(guī)則的新錯(cuò)誤 ( Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='。我檢查并轉(zhuǎn)換了數(shù)據(jù)庫(kù)和表utf8mb4_general_ci,一切都按預(yù)期工作。

感謝那些提供解決方案的人,但這是我們最終選擇的路線。


查看完整回答
反對(duì) 回復(fù) 2023-02-06
?
慕絲7291255

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

與大多數(shù)查詢接口一樣,該Query()函數(shù)一次只能執(zhí)行一個(gè) SQL 語(yǔ)句。MySQL 的準(zhǔn)備語(yǔ)句不適用于多查詢。


SET您可以通過(guò)在一次調(diào)用中執(zhí)行語(yǔ)句,然后在第二次調(diào)用中執(zhí)行語(yǔ)句來(lái)解決此問(wèn)題SELECT。但是您必須注意確保它們?cè)谕粋€(gè)數(shù)據(jù)庫(kù)連接上執(zhí)行,否則連接池很可能在不同的連接上運(yùn)行它們。所以你需要做類似的事情:


conn, err := d.Conn(context.TODO())


conn.QueryContext(context.TODO(), "SET ...")

conn.QueryContext(context.TODO(), "SELECT ...")

或者,更改準(zhǔn)備 ORDER BY 的方式,這樣就不需要用戶定義的變量。


我這樣做的方法是在 Go 代碼中而不是在 SQL 中構(gòu)建 ORDER BY 語(yǔ)句,使用字符串映射來(lái)確保使用有效的列和方向。如果輸入不在地圖中,則將默認(rèn)順序設(shè)置為主鍵。


validOrders := map[string]string{

    "type,asc":         "type ASC",

    "type,desc":        "type DESC",

    "visible,asc":      "visible ASC",

    "visible,desc":     "visible DESC",

    "create_date,asc":  "create_date ASC",

    "create_date,desc": "create_date DESC",

    "update_date,asc":  "update_date ASC",

    "update_date,desc": "update_date DESC",

}

orderBy, ok := validOrders[srt]

if !ok {

    orderBy = "id ASC"

}

query := fmt.Sprintf(`

    SELECT ...

    WHERE user_id = ?

    ORDER BY %s

    LIMIT ?, ?

`, orderBy)

這對(duì)于 SQL 注入是安全的,因?yàn)楹瘮?shù)輸入不會(huì)插入到查詢中。它是從我的地圖中插入到查詢中的值,并且該值在我的控制之下。如果有人試圖輸入一些惡意值,它不會(huì)匹配我地圖中的任何鍵,所以它只會(huì)使用默認(rèn)排序順序。


查看完整回答
反對(duì) 回復(fù) 2023-02-06
?
德瑪西亞99

TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊

除非驅(qū)動(dòng)程序?qū)崿F(xiàn)特殊接口,否則查詢?cè)趫?zhí)行前首先在服務(wù)器上準(zhǔn)備好。因此 Bindvars 是特定于數(shù)據(jù)庫(kù)的:

  • MySQL:使用?上面顯示的變體

  • PostgreSQL:使用枚舉的 $1、$2 等 bindvar 語(yǔ)法

  • SQLite:接受兩者?和 $1 語(yǔ)法

  • Oracle:使用 :name 語(yǔ)法

  • MsSQL:@(隨你用)

我想這就是為什么你不能用 query() 做你想做的事。


查看完整回答
反對(duì) 回復(fù) 2023-02-06
  • 3 回答
  • 0 關(guān)注
  • 339 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)