Du kan ikke bruge pladsholdere til identifikatorer (såsom tabel- og kolonnenavne), pladsholdere er for værdier . Du kan tænke på identifikatorer som at ligne variabel- eller funktionsnavne i Go, så at kunne bruge pladsholdere til identifikatorer ville svare til at have en eval
som i forskellige scriptsprog.
Dette reducerer dig til at bruge fmt.Sprintf
og lignende strengoperationer til opbygning af SQL'en, når du ikke kender identifikatorerne før runtime:
col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)
men dette åbner dig for SQL-injektion og citeringsproblemer, så du vil have en slags hvidliste:
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)
Bemærk, at jeg har inkluderet MySQL-backtick-citatet i kortets værdier. Der er intet i standardgrænsefladen til at citere/undslippe en identifikator, så du skal gøre det selv. Hvis du allerede skriver hvidlistekortet i hånden, kan du lige så godt inkludere citatet i hånden; ellers kan du skrive din egen citeringsfunktion til identifikatorer ved at læse MySQL-dokumentationen om citering og udføre et par (forhåbentlig) simple strengoperationer.