sql >> Databasteknik >  >> RDS >> Mysql

Använder du platshållare? i Go mySql-fråga för allt annat än int

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.




  1. Hur man konfigurerar PostgreSQL Sharding med ClusterControl

  2. Vad är en lagrad procedur?

  3. rätt syntax att använda nära '?'

  4. MySQL:flera tabeller eller en tabell med många kolumner?