Вы не хотите использовать Sprintf
для ввода необработанных значений в SQL, это плохая привычка.То, что вы хотите сделать, это построить немного SQL с правильным количеством заполнителей, а затем позволить библиотеке позаботиться о замене заполнителей их значениями.
Если у вас есть два int
s в вашем массиве, тоВы хотите построить это:
SELECT some_column
FROM table_name
WHERE id IN (?, ?)
Если у вас есть четыре, то вы хотите построить:
SELECT some_column
FROM table_name
WHERE id IN (?, ?, ?, ?)
и так далее.Все, что вам нужно, это простая функция, которая может производить n
заполнителей;Есть много способов сделать это:
func placeholders(n int) string {
ps := make([]string, n)
for i := 0; i < n; i++ {
ps[i] = "?"
}
return strings.Join(ps, ",")
}
или, может быть:
func placeholders(n int) string {
var b strings.Builder
for i := 0; i < n - 1; i++ {
b.WriteString("?,")
}
if n > 0 {
b.WriteString("?")
}
return b.String()
}
или что бы то ни было для вас очевиднее, реализация вряд ли окажет какое-либо измеримое влияние, пока онаПравильно.
Тогда вы можете сказать что-то вроде:
query := fmt.Sprintf("select some_column from table_name where id in (%s)", placeholders(len(idsToGet)))
rows, err := db.Query(query, idsToGet...)
и бросить вращение rows
обычным способом.