Nelze použít zástupné symboly pro identifikátory (jako jsou názvy tabulek a sloupců), zástupné symboly jsou pro hodnoty . Identifikátory si můžete představit jako podobné názvům proměnných nebo funkcí v Go, takže možnost používat zástupné symboly pro identifikátory by bylo podobné jako mít eval
jako v různých skriptovacích jazycích.
To vás omezí na použití fmt.Sprintf
a podobné operace s řetězci pro sestavení SQL, když neznáte identifikátory až do běhu:
col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)
ale to vás otevírá problémům s injekcí SQL a citováním, takže byste chtěli nějaký druh bílé listiny:
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)
Všimněte si, že jsem do hodnot mapy zahrnul zpětné citace MySQL. Ve standardním rozhraní není nic pro citování/escapování identifikátoru, takže to musíte udělat sami. Pokud již mapu bílé listiny píšete ručně, můžete také zahrnout citaci ručně; jinak byste si mohli napsat vlastní citovací funkci pro identifikátory tak, že si přečtete dokumentaci MySQL o citacích a provedete pár (doufejme) jednoduchých operací s řetězci.