[GO] argument de conversion $ 1 type: type non pris en charge [] chaîne, une tranche de chaîne

Aperçu

Ceci est le premier poste pour la première année d'un ingénieur. Quand je faisais une opération DB en utilisant sqlx, j'ai été troublé par l'erreur suivante, donc je vais l'enregistrer. Je vous serais reconnaissant si vous pouviez commenter et me donner une mauvaise idée.

converting argument $1 type: unsupported type []string, a slice of string

scénario

Lorsque j'essayais d'effectuer une opération en utilisant la condition IN dans la clause WHERE de l'instruction SELECT, j'ai eu une erreur. Cette fois, j'écrirai une opération pour extraire USER qui peut utiliser go et python à partir de la table USER suivante.

Name Skill
Ichiro C
Jiro C#
Saburo Java
Shiro python
Goro go
Rokuro Ruby
Shichiro go

Divers outils

Code qui était inutile

	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

Passez la chaîne [] comme paramètre à db.Select. Je me demande si cela fonctionnera car la compilation passera, mais j'obtiens une erreur dans le sujet. Au fait, si le troisième argument est searchSkills ..., la compilation ne passera pas.

Qu'est-il arrivé

Je comprends en quelque sorte que le type passé comme argument en tant que message d'erreur n'est pas bon. Pour le moment, lisez le document. https://godoc.org/github.com/jmoiron/sqlx#DB.Select

Puisque le troisième argument était un argument de longueur variable de ʻinterface {} , développons [] interface {} `et lançons-le.

	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

Vous pouvez faire ce que vous voulez avec moins d'erreur. Mais ce n'est pas très intelligent ... Il n'est pas bon que vous deviez changer le nombre de «?» En fonction des conditions d'extraction. Cela semble étrange de le définir avec [] interface {}.

sqlx.In Il y avait quelque chose de pratique. Vous pouvez le rendre plus intelligent en utilisant la fonction In () fournie par sqlx.

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

En passant l'instruction SQL sous-jacente à la fonction In () et à la tranche que vous souhaitez utiliser pour les paramètres, il créera une requête qui ajuste le nombre d'espaces réservés en fonction du nombre d'éléments de la tranche. Après cela, si vous le passez à db.Select () avec param qui est devenu [] interface {}, vous pouvez effectuer une recherche en utilisant la condition In. Dans ce cas, il semble qu'il n'y ait pas lieu de s'inquiéter du nombre de conditions d'extraction et du type de paramètres. Génial.

En passant, si vous passez une tranche avec 0 élément à la fonction In (), l'erreur suivante se produira, alors soyez prudent.

empty slice passed to 'in' query

référence

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

Recommended Posts

argument de conversion $ 1 type: type non pris en charge [] chaîne, une tranche de chaîne
Découpez une partie de la chaîne à l'aide d'une tranche Python
Format lors du passage d'une longue chaîne comme argument de python
Spécification du fuseau horaire lors de la conversion d'une chaîne de caractères en type datetime avec python
Conversion de chaîne d'une liste contenant des nombres
[python] [meta] Le type de python est-il un type?
Définissez un type d'argument personnalisé avec un clic (Exemple: Implémentation d'un type qui fait d'une chaîne eval une valeur optionnelle)
Mémorandum du processus de suppression de chaîne python
tranche de chaîne python
Type de chaîne Python2
Python # type de chaîne
Obtenez le nom de la variable sous forme de chaîne de caractères.
Convertir un objet de tranche en liste de numéros d'index
Comment écrire un type liste / dictionnaire de Python3
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
Ce qui est plus rapide à utiliser l'instruction if ou le type de dictionnaire lors de la conversion d'une chaîne (a-> b) en Python