首頁 >後端開發 >Golang >如何在 Go 中使用切片透過 IN 子句查詢資料庫?

如何在 Go 中使用切片透過 IN 子句查詢資料庫?

DDD
DDD原創
2024-10-26 15:44:02291瀏覽

How to Query a Database with an IN Clause Using a Slice in Go?

在Go 中使用帶有切片的IN 子句查詢資料庫

在資料庫查詢中,通常使用基於值的子集來過濾結果IN 子句。然而,在 Go 中使用整數切片時,創建語法上有效且符合慣用語的 IN 子句可能具有挑戰性。

考慮以下查詢,該查詢嘗試從兩個連接表中檢索不同的標題。 IN 子句填入了名為 artIds 的切片的內容:

<code class="go">inq := "6,7" //strings.Join(artIds, ",")
rows, err = db.Query("SELECT DISTINCT title FROM tags_for_articles LEFT JOIN tags ON tags.id = tags_for_articles.tag_id WHERE article_id IN (?)", inq)</code>

為簡潔起見,已省略錯誤處理。查詢失敗,因為database/sql將參數直接傳遞給驅動程序,驅動程式需要可變數量的bindvars,取決於切片的長度。

或者,使用靜態IN子句的查詢將成功執行:

<code class="go">rows, err = db.Query("SELECT DISTINCT title FROM tags_for_articles LEFT JOIN tags ON tags.id = tags_for_articles.tag_id WHERE article_id IN (6,7)", inq)</code>

此問題的解決方案是使用sqlx 庫,它提供了對資料庫查詢的更多控制。 sqlx.In 函數可用於處理帶有 IN 子句的查詢並動態建立必要的綁定變數:

<code class="go">var levels = []int{4, 6, 7}
query, args, err := sqlx.In("SELECT * FROM users WHERE level IN (?);", levels)</code>

然後可以使用產生的查詢和參數來執行準備好的語句。使用 sqlx.In 函數可確保查詢在語法上有效,並且可以使用給定的值切片有效執行。

以上是如何在 Go 中使用切片透過 IN 子句查詢資料庫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn