Utilisation de requêtes Go MySQL avec des variables SET
Vous essayez d'écrire une requête Go MySQL qui définit des variables et les utilise de manière complexe Clause ORDER BY. La requête s'exécute avec succès dans la console mais rencontre une erreur de syntaxe dans Go.
Solution possible
Malheureusement, le package base de données/sql de Go ne prend actuellement pas en charge la configuration des utilisateurs MySQL. variables définies. Par conséquent, l'approche décrite dans la question n'est pas réalisable avec les limitations actuelles du package.
Approches alternatives
Génération de requêtes dynamiques :
Une alternative consiste à générer dynamiquement la clause ORDER BY en fonction des paramètres d'entrée, éliminant ainsi le besoin de substitution de variable.
<code class="go">func (d *DB) SelectByUserId(uid string, srt string, pg, lim int) ([]Inventory, error) { query := ` SELECT * FROM inventory WHERE user_id = ? ORDER BY ` + generateOrderBy(srt) + ` LIMIT ?,?; ` rows, err := d.Query( query, uid, pg*lim, lim, ) // ... (rest of the code remains the same) return result, nil } func generateOrderBy(srt string) string { order := "" switch srt { case "type,asc": order = "`type` ASC" case "type,desc": order = "`type` DESC" // ... (add other cases) } return order }</code>
Extension des paramètres :
Vous pouvez également développer manuellement le ? des espaces réservés dans la chaîne de requête pour éviter le besoin de variables. Cette approche consiste à construire une chaîne qui remplace chaque ? avec la valeur du paramètre correspondante.
<code class="go">func (d *DB) SelectByUserId(uid string, srt string, pg, lim int) ([]Inventory, error) { query := fmt.Sprintf(` SELECT * FROM inventory WHERE user_id = '%s' ORDER BY CASE WHEN '%s' = 'type,asc' THEN `type` END, CASE WHEN '%s' = 'type,desc' THEN `type` END DESC, CASE WHEN '%s' = 'visible,asc' THEN visible END, CASE WHEN '%s' = 'visible,desc' THEN visible END DESC, CASE WHEN '%s' = 'create_date,asc' THEN create_date END, CASE WHEN '%s' = 'create_date,desc' THEN create_date END DESC, CASE WHEN '%s' = 'update_date,asc' THEN update_date END, CASE WHEN '%s' = 'update_date,desc' THEN update_date END DESC LIMIT %d,%d; `, uid, srt, srt, srt, srt, srt, srt, srt, srt, pg*lim, lim) rows, err := d.Query( query, ) // ... (rest of the code remains the same) return result, nil }</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!