Vous ne pouvez pas utiliser d'espaces réservés pour les identifiants (tels que les noms de table et de colonne), les espaces réservés sont pour les valeurs . Vous pouvez considérer les identifiants comme étant similaires aux noms de variables ou de fonctions dans Go, donc pouvoir utiliser des espaces réservés pour les identifiants reviendrait à avoir un eval
comme dans divers langages de script.
Cela vous réduit à utiliser fmt.Sprintf
et des opérations de chaîne similaires pour construire le SQL lorsque vous ne connaissez pas les identifiants jusqu'à l'exécution :
col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)
mais cela vous expose à des problèmes d'injection SQL et de guillemets, vous voudriez donc une sorte de liste blanche :
quotedColumns := map[string]string{
"firstName": "`firstName`",
"lastName": "`lastName`",
...
}
quoted, ok := quotedColumns[columnName]
if !ok {
// Do something with the error here and run away...
}
sql := fmt.Sprintf("select %s from persons", quoted)
Notez que j'ai inclus le backtick MySQL entre guillemets dans les valeurs de la carte. Il n'y a rien dans l'interface standard pour citer/échapper un identifiant, vous devez donc le faire vous-même. Si vous écrivez déjà la carte de la liste blanche à la main, vous pouvez également inclure la citation à la main; sinon, vous pouvez écrire votre propre fonction de guillemets pour les identifiants en lisant la documentation MySQL sur les guillemets et en effectuant quelques opérations de chaîne simples (espérons-le).