Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utiliser un espace réservé ? dans la requête Go mySql pour autre chose que int

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).