Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Fazendo consultas SQL dinâmicas para um banco de dados MySQL


Se você tiver um mapa com os nomes e valores dos campos como este:
m := map[string]interface{}{"UserID": 1234, "Age": 18}

então você pode construir a consulta assim:
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...)

Isso não é suscetível à injeção de SQL porque os espaços reservados são usados ​​para partes da consulta fora do controle direto do aplicativo.

Se as chaves do mapa são conhecidas por serem nomes de campo permitidos, use isto:
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...)