Mengapa Pertanyaan Pangkalan Data Go Saya dengan Klausa IN Gagal Apabila Menggunakan Secebis Integer?

Susan Sarandon
Lepaskan: 2024-10-25 17:22:38
asal
873 orang telah melayarinya

Why Does My Go Database Query with an IN Clause Fail When Using a Slice of Integers?

Enigma Pangkalan Data IN Klausa dalam Go

Pertanyaan pangkalan data dengan klausa IN adalah keperluan biasa, namun pelaksanaannya dalam Go telah menyebabkan ramai pembangun bingung. Apabila cuba melaksanakan pertanyaan menggunakan kepingan integer sebagai parameter klausa IN, sesetengah penyelesaian mungkin kelihatan berlawanan dengan intuitif.

Dalam contoh yang disediakan, pertanyaan gagal apabila menggunakan perwakilan rentetan bagi kepingan sebagai hujah untuk DALAM klausa:

<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>
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini berjaya:

<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>
Salin selepas log masuk

Punca percanggahan ini terletak pada tingkah laku pakej pangkalan data/sql. Ia tidak memeriksa pertanyaan dan menghantar hujah terus kepada pemacu pangkalan data. Oleh itu, bindvar (?) dalam pertanyaan sepadan dengan satu argumen, bukan bilangan pembolehubah argumen seperti yang diingini.

<code class="go">var levels = []int{4, 6, 7}
rows, err := db.Query("SELECT * FROM users WHERE level IN (?);", levels)</code>
Salin selepas log masuk

Mujurlah, pakej sqlx menyediakan penyelesaian yang lebih anggun untuk masalah ini. Menggunakan sqlx.In, seseorang boleh memproses pertanyaan sebelum pelaksanaan:

<code class="go">query, args, err := sqlx.In("SELECT * FROM users WHERE level IN (?);", levels)</code>
Salin selepas log masuk

Untuk panduan yang lebih komprehensif, rujuk dokumentasi Godoc pada InQueries.

Atas ialah kandungan terperinci Mengapa Pertanyaan Pangkalan Data Go Saya dengan Klausa IN Gagal Apabila Menggunakan Secebis Integer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!