sql >> Databáze >  >> RDS >> Mysql

Používáte zástupný symbol? v dotazu Go mySql na cokoli jiného než int

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.




  1. Jak získat seznam měsíců mezi 2 danými daty pomocí dotazu?

  2. Jak spustit skript Oracle sql prostřednictvím kódu Java

  3. PHP Kontrola NULL

  4. Zajímavosti o spouštěčích MÍSTO