[Go] sqlx gère les requêtes qui incluent des clauses IN avec Named Stmt

Il s'agit d'un exemple de code expliquant comment gérer une requête contenant une clause IN dans NamedStmt dans sqlx. Il peut également être appliqué à la clause EXISTS.

Exemple de code

main.go


func main() {
	userIds := []int{1, 2, 3, 4, 5}
	age := 20
	select(ids, createdAt)
}

select.go


var db *sqlx.DB

func select(userIds []int, age int) []User {

	//Modèle SQL
	originQuery := `SELECT * FROM USER WHERE USER_ID IN (:USER_ID) AND AGE > :AGE`

	//Valeur à lier
	arg := map[string]interface{}{
		"USER_ID":  userIds,
		"AGE": age,
	}

	//Rendre la clause IN utilisable dans NamedStmt
	query, params := formatQuery(&originQuery, &arg)

	//Exécuter l'instruction Select
	namedStmt, _ := db.PrepareNamedContext(context.Background(), *query)

	var users []User
	namedStmt.SelectContext(context.Background(), &sqlxSamples, *params)

	return users
}

format.go


func formatQuery(q *string, a *map[string]interface{}) (*string, *map[string]interface{}) {

	query, args, _ := sqlx.Named(*q, *a)
	fmt.Println(query) // SELECT * FROM USER WHERE USER_ID IN (?) AND AGE > ?
	fmt.Println(args)  // [[1 2 3 4 5] 20]

	query, args, _ = sqlx.In(query, args...)
	fmt.Println(query) // SELECT * FROM USER WHERE USER_ID IN (?, ?, ?, ?, ?) AND AGE > ?
	fmt.Println(args)  // [1 2 3 4 5 20]

	query = sqlx.Rebind(sqlx.NAMED, query)
	params := map[string]interface{}{}
	for i, arg := range args {
		key := fmt.Sprintf("arg%d", i+1)
		params[key] = arg
	}
	fmt.Println(query)  // SELECT * FROM USER WHERE USER_ID IN (:arg1, :arg2, :arg3, :arg4, :arg5) AND AGE > :arg6
	fmt.Println(params) // map[arg1:1 arg2:2 arg3:3 arg4:4 arg5:5 arg6:20]

	return &query, &params
}

Si vous définissez la variable de liaison SQL avec ? A l'avance, vous n'aurez peut-être pas besoin de sqlx.Named ().

Recommended Posts

[Go] sqlx gère les requêtes qui incluent des clauses IN avec Named Stmt
Hello World avec gRPC / go dans l'environnement Docker
Gérer les fichiers zip avec des noms de fichiers japonais dans Python 3
Gérer les types entiers avec des valeurs manquantes dans Pandas