3 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
對(duì)于那些感興趣的人,我已經(jīng)通過(guò)一些更新解決了我的問(wèn)題。
連接時(shí)在DSN上有設(shè)置
?...&multiStatements=true&interpolateParams=true
添加以上內(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ù)期工作。
感謝那些提供解決方案的人,但這是我們最終選擇的路線。

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)排序順序。

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() 做你想做的事。
- 3 回答
- 0 關(guān)注
- 339 瀏覽
添加回答
舉報(bào)