sql >> Database >  >> RDS >> Mysql

Dynamische SQL-query's maken naar een MySQL DB

Als u een kaart heeft met de veldnamen en waarden als volgt:

m := map[string]interface{}{"UserID": 1234, "Age": 18}

dan kun je de query als volgt bouwen:

var values []interface{}
var where []string
for _, k := range []string{"userId", "gender", "age", "name", "height", "weight", "ethnicity"} {
    if v, ok := m[k]; ok {
        values = append(values, v)
        where = append(where, fmt.Sprintf("%s = ?", k))
    }
}
r, err := db.QueryRow("SELECT name FROM users WHERE " + strings.Join(where, " AND "), values...)

Dit is niet gevoelig voor SQL-injectie, omdat tijdelijke aanduidingen worden gebruikt voor delen van de query die buiten de directe controle van de toepassing vallen.

Als bekend is dat de kaartsleutels toegestane veldnamen zijn, gebruik dan dit:

var values []interface{}
var where []string
for k, v := range m {
    values = append(values, v)
    where = append(where, fmt.Sprintf("%s = ?", k))
}
r, err := db.QueryRow("SELECT name FROM users WHERE " + strings.Join(where, " AND "), values...)



  1. Hoe kan ik het trage querylogboek van MySQL inschakelen zonder MySQL opnieuw te starten?

  2. Datumbereik snijpunt in SQL

  3. Van Opgeslagen procedure, retourneer OUT-parameter &OUT-cursor &ontleden resultaat (Oracle)

  4. Hoe kan ik voorbereide verklaringen in CodeIgniter gebruiken?