sql >> Database teknologi >  >> RDS >> Mysql

Bruger du pladsholder? i Go mySql-forespørgsel til alt andet end int

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.




  1. Tabeller, hvis eneste formål er at angive en delmængde af en anden tabel

  2. Forespørgselsprofilering 101 — Ja, det kan virkelig forbedre din SQL Server-ydeevne

  3. PostgreSQL deaktiver mere output

  4. OPRET TABEL SOM A1 som A2