Heim > Artikel > Backend-Entwicklung > Wie führe ich eine Go-Datenbankabfrage mit einem Slice in der IN-Klausel aus?
Frage:
Warum erfolgt die folgende Golang-Datenbankabfrage? Die Verwendung eines Segments von Ints in der IN-Klausel schlägt fehl:
<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>
Antwort:
Das Problem tritt auf, weil das für die Abfrage verwendete Datenbank-/SQL-Paket die nicht überprüft Abfrage und übergibt die Argumente direkt an den Datenbanktreiber. Dies macht die Handhabung von Abfragen mit IN-Klauseln, die eine variable Anzahl von Argumenten enthalten, zu einer Herausforderung.
In der bereitgestellten Abfrage steht das ? Die Bindungsvariable entspricht einem einzelnen Argument, während die beabsichtigte Verwendung darin besteht, mehrere Argumente basierend auf der Länge der Slice-ArtIds zu binden. Der Treiber ist jedoch nicht in der Lage, dies korrekt zu verarbeiten.
Um dieses Problem zu beheben, wird empfohlen, das SQLX-Paket zu verwenden, das eine bessere Kontrolle über Datenbankabfragen bietet.
Lösung verwenden das sqlx-Paket:
<code class="go">var artIds = []int{6, 7} query, args, err := sqlx.In("SELECT DISTINCT title FROM tags_for_articles LEFT JOIN tags ON tags.id = tags_for_articles.tag_id WHERE article_id IN (?);", artIds)</code>
Die sqlx.In-Funktion verarbeitet die Abfrage und generiert die entsprechenden Bindevariablen für den Ints-Slice, sodass die Abfrage erfolgreich ausgeführt werden kann.
Weitere Informationen zu diesem Thema finden Sie in der Godoc-Dokumentation für InQueries.
Das obige ist der detaillierte Inhalt vonWie führe ich eine Go-Datenbankabfrage mit einem Slice in der IN-Klausel aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!