Mysql
 sql >> Base de données >  >> RDS >> Mysql

Effectuer des requêtes SQL dynamiques vers une base de données MySQL

Si vous avez une carte avec des noms de champs et des valeurs comme ceci :

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

alors vous pouvez créer la requête comme ceci :

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...)

Ceci n'est pas sensible à l'injection SQL car les espaces réservés sont utilisés pour des parties de la requête en dehors du contrôle direct de l'application.

Si les clés de carte sont connues pour être des noms de champs autorisés, utilisez ceci :

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...)