Du kan inte använda platshållare för identifierare (som tabell- och kolumnnamn), platshållare är för värden . Du kan tänka dig att identifierare liknar variabel- eller funktionsnamn i Go, så att kunna använda platshållare för identifierare skulle vara ungefär som att ha en eval
som i olika skriptspråk.
Detta reducerar dig till att använda fmt.Sprintf
och liknande strängoperationer för att bygga SQL när du inte känner till identifierarna förrän vid körning:
col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)
men detta öppnar upp för SQL-injektion och citeringsproblem så att du vill ha någon sorts vitlista:
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)
Observera att jag har inkluderat MySQL backtick-citat i kartans värden. Det finns inget i standardgränssnittet för att citera/flykta en identifierare så du måste göra det själv. Om du redan skriver vitlistaskartan för hand kan du lika gärna inkludera citatet för hand också; annars kan du skriva din egen citatfunktion för identifierare genom att läsa MySQL-dokumentationen om citering och göra ett par (förhoppningsvis) enkla strängoperationer.