Créer efficacement des requêtes SQL dans Go
Concaténer des chaînes avec des valeurs dans des requêtes SQL texte peut être un peu délicat dans Go. Contrairement à Python, la syntaxe de formatage des chaînes de Go se comporte différemment, ce qui entraîne des erreurs courantes comme celle rencontrée ici.
Erreur de syntaxe du tuple
L'extrait de code initial tente d'utiliser un Python -tuple de style, qui n'est pas pris en charge dans Go. Cela entraîne une erreur de syntaxe :
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %d AND column2_name = %d`,
(val1, val2))
Types incompatibles
La tentative de conversion des éléments du tuple en chaînes échoue également en raison d'une incompatibilité de type :
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %d AND column2_name = %d`,
val1, val2)
Éviter les erreurs d'opérateur
Convertir les paramètres sous forme de chaînes et les concaténer avec l'opérateur %s fonctionnerait mais n'est pas recommandé. Cette approche introduit le risque de non-concordance des opérateurs :
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %s AND column2_name = %s`,
strconv.Itoa(val1), val2)
La solution Go
Pour écrire correctement une requête SQL texte avec concaténation de valeurs dans Go, utilisez fmt.Sprintf comme suit :
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %d AND column2_name = %s`,
val1, val2)
Cette syntaxe évite les vulnérabilités d'injection et garantit une conversion de type appropriée.
Prévention des injections
Pour éviter les attaques par injection SQL, utilisez toujours des ou fournissez des caractères d'échappement pour les entrées fournies par l'utilisateur.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3