Non puoi utilizzare i segnaposto per gli identificatori (come i nomi di tabelle e colonne), i segnaposto sono per i valori . Puoi pensare agli identificatori come simili a nomi di variabili o funzioni in Go, quindi essere in grado di utilizzare i segnaposto per gli identificatori sarebbe come avere un eval
come in vari linguaggi di scripting.
Questo ti riduce a usare fmt.Sprintf
e operazioni di stringa simili per la creazione dell'SQL quando non conosci gli identificatori fino al runtime:
col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)
ma questo ti apre all'iniezione di SQL e ai problemi di citazione, quindi vorresti una sorta di whitelist:
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)
Nota che ho incluso le virgolette di MySQL nei valori della mappa. Non c'è nulla nell'interfaccia standard per citare/sfuggire a un identificatore, quindi devi farlo da solo. Se stai già scrivendo manualmente la mappa della whitelist, puoi anche includere la citazione a mano; altrimenti potresti scrivere la tua funzione di quotazione per gli identificatori leggendo la documentazione di MySQL sulle quotazioni ed eseguendo un paio (si spera) semplici operazioni sulle stringhe.