[GO] Konvertierungsargument $ 1 Typ: Nicht unterstützter Typ [] String, ein Stück String

Überblick

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

Szenario

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

Verschiedene Werkzeuge

Code, der nutzlos war

	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.

Was ist passiert

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

Referenz

golang: sql: converting argument $1 type: unsupported type []int32, a slice of int32

Recommended Posts

Konvertierungsargument $ 1 Typ: Nicht unterstützter Typ [] String, ein Stück String
Schneiden Sie einen Teil der Zeichenfolge mit einem Python-Slice aus
Format, wenn eine lange Zeichenfolge als Python-Argument übergeben wird
Zeitzonenspezifikation beim Konvertieren einer Zeichenfolge in einen Datums- / Uhrzeittyp mit Python
String-Konvertierung einer Liste mit Zahlen
[Python] [Meta] Ist der Python-Typ ein Typ?
Definieren Sie einen benutzerdefinierten Argumenttyp mit einem Klick (Beispiel: Implementierung eines Typs, der eine Bewertungszeichenfolge zu einem optionalen Wert macht)
Memorandum zum Löschen von Python-Strings
Python String Slice
Python2-Zeichenfolgentyp
Python # String-Typ
Ruft den Variablennamen der Variablen als Zeichenfolge ab.
Konvertieren Sie das Slice-Objekt in eine Liste mit Indexnummern
So schreiben Sie einen Listen- / Wörterbuchtyp von Python3
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Dies ist schneller zu verwenden, wenn Anweisung oder Wörterbuchtyp beim Konvertieren einer Zeichenfolge (a-> b) in Python