Jeśli masz mapę z nazwami pól i wartościami takimi jak ta:
m := map[string]interface{}{"UserID": 1234, "Age": 18}
następnie możesz zbudować zapytanie w ten sposób:
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...)
Nie jest to podatne na wstrzyknięcie SQL, ponieważ symbole zastępcze są używane dla części zapytania poza bezpośrednią kontrolą aplikacji.
Jeśli wiadomo, że klawisze mapy są dozwolonymi nazwami pól, użyj tego:
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...)