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
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 |
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.
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
golang: sql: converting argument $1 type: unsupported type []int32, a slice of int32
Recommended Posts