sql >> Base de Datos >  >> RDS >> Mysql

Realización de consultas SQL dinámicas a una base de datos MySQL

Si tiene un mapa con los nombres de campo y valores como este:

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

entonces puedes construir la consulta de esta manera:

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

Esto no es susceptible a la inyección SQL porque los marcadores de posición se usan para partes de la consulta fuera del control directo de la aplicación.

Si se sabe que las claves del mapa son nombres de campo permitidos, use esto:

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