Mysql
 sql >> Database >  >> RDS >> Mysql

Usare il segnaposto? nella query Go mySql per qualcosa di diverso da int

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.