sql >> Database >  >> RDS >> Mysql

Tijdelijke aanduiding gebruiken? in Go mySql-query voor iets anders dan int

U kunt geen tijdelijke aanduidingen gebruiken voor ID's (zoals tabel- en kolomnamen), tijdelijke aanduidingen zijn voor waarden . U kunt ID's beschouwen als vergelijkbaar met namen van variabelen of functies in Go, dus het gebruik van tijdelijke aanduidingen voor ID's zou vergelijkbaar zijn met het hebben van een eval zoals in verschillende scripttalen.

Dit reduceert u tot het gebruik van fmt.Sprintf en soortgelijke tekenreeksbewerkingen voor het bouwen van de SQL wanneer u de identifiers niet kent tot runtime:

col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)

maar dit stelt je bloot aan problemen met SQL-injectie en citaten, dus je zou een soort witte lijst willen:

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)

Merk op dat ik de MySQL-backtick-citaten heb opgenomen in de waarden van de kaart. Er is niets in de standaardinterface voor het citeren/ontsnappen van een identifier, dus u moet het zelf doen. Als je de whitelist-kaart al met de hand schrijft, kun je het citaat net zo goed met de hand opnemen; anders zou je je eigen aanhalingsfunctie voor identifiers kunnen schrijven door de MySQL-documentatie over citeren te lezen en een paar (hopelijk) eenvoudige tekenreeksbewerkingen uit te voeren.




  1. Stuurprogramma JDBC PostgreSQL met Android

  2. Kan rijen groeperen niet selecteren op created_at

  3. VarBinary vs Image SQL Server-gegevenstype om binaire gegevens op te slaan?

  4. Parametersnuiven (of spoofen) in SQL Server