Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Pertanyaan Pangkalan Data Go Saya dengan Klausa IN Gagal Apabila Menggunakan Secebis Integer?

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

Susan Sarandon
Susan Sarandonasal
2024-10-25 17:22:38855semak imbas

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>

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>

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>

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>

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!

Kenyataan:
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