Dies ist der erste Beitrag für das erste Jahr eines Ingenieurs. Als ich eine DB-Operation mit sqlx ausführte, wurde ich durch den folgenden Fehler beunruhigt, daher werde ich ihn aufzeichnen. Ich wäre Ihnen dankbar, wenn Sie mir eine schlechte Idee geben könnten.
converting argument $1 type: unsupported type []string, a slice of string
Beim Versuch, eine Operation mit der IN-Bedingung in der WHERE-Klausel der SELECT-Anweisung auszuführen, ist ein Fehler aufgetreten. Dieses Mal werde ich eine Operation schreiben, um USER zu extrahieren, der go und Python aus der folgenden USER-Tabelle verwenden kann.
Name | Skill |
---|---|
Ichiro | C |
Jiro | C# |
Saburo | Java |
Shiro | python |
Goro | go |
Rokuro | Ruby |
Shichiro | go |
query := "SELECT Name,Skill FROM USER WHERE Skill IN (?,?);"
searchSkills := []string{"go", "python"}
var records []User
err := db.Select(&records, query, searchSkills)
if err != nil {
log.Fatal(err)
}
//converting argument $1 type: unsupported type []string, a slice of string
Übergeben Sie die Zeichenfolge [] als Parameter an db.Select. Ich frage mich, ob es funktionieren wird, da die Kompilierung erfolgreich sein wird, aber ich erhalte einen Fehler im Betreff. Übrigens, wenn das dritte Argument "searchSkills ..." ist, wird die Kompilierung nicht bestanden.
Ich verstehe irgendwie, dass der Typ, der als Argument als Fehlermeldung übergeben wurde, nicht gut ist. Lesen Sie vorerst das Dokument. https://godoc.org/github.com/jmoiron/sqlx#DB.Select
Da das dritte Argument ein Argument variabler Länge von "interface {}" war, erweitern wir "[] interface {}" und werfen es.
query := "SELECT Name,Skill FROM USER WHERE Skill IN (?,?)"
// searchSkills := []string{"go", "python"}
searchSkills := []interface{}{"go", "python"}
var records []User
err := db.Select(&records, query, searchSkills...)
if err != nil {
log.Fatal(err)
}
// Name:Jiro,Skill:go
// Name:Saburo,Skill:go
// Name:Goro,Skill:python
Sie können mit weniger Fehlern tun, was Sie wollen.
Aber es ist nicht sehr klug ...
Es ist nicht gut, dass Sie die Anzahl der ?
Abhängig von den Extraktionsbedingungen ändern müssen.
Es fühlt sich seltsam an, es mit [] interface {} zu definieren.
sqlx.In Da war etwas Bequemes. Sie können es intelligenter machen, indem Sie die In () -Funktion von sqlx verwenden.
func In(query string, args ...interface{}) (string, []interface{}, error) https://godoc.org/github.com/jmoiron/sqlx#In
queryBase := "SELECT Name,Skill FROM USER WHERE Skill IN (?)"
searchSkills := []string{"go", "python"}
query, param, err := sqlx.In(queryBase, searchSkills)
if err != nil {
log.Fatal(err)
}
var records []User
err = db.Select(&records, query, param...)
if err != nil {
log.Fatal(err)
}
// Name:Jiro,Skill:go
// Name:Saburo,Skill:go
// Name:Goro,Skill:python
Durch Übergeben der zugrunde liegenden SQL-Anweisung an die In () -Funktion und das Slice, das Sie für die Parameter verwenden möchten, wird eine Abfrage erstellt, die die Anzahl der Platzhalter entsprechend der Anzahl der Elemente im Slice anpasst.
Wenn Sie es danach zusammen mit param
, das zu [] interface {}
wurde, an db.Select ()
übergeben, können Sie mit der In-Bedingung suchen.
In diesem Fall scheint es nicht erforderlich zu sein, sich über die Anzahl der Extraktionsbedingungen und die Art der Parameter Gedanken zu machen.
Toll.
Übrigens, wenn Sie ein Slice mit 0 Elementen an die In () - Funktion übergeben, tritt der folgende Fehler auf. Seien Sie also vorsichtig.
empty slice passed to 'in' query
golang: sql: converting argument $1 type: unsupported type []int32, a slice of int32