SQL + goLang - выполнение оператора select с условием IN - и передача ему массива идентификаторов? - PullRequest
0 голосов
/ 01 июня 2018

Я хочу выполнить следующую логику -

SELECT some_column
FROM table_name
WHERE id IN (value1, value2, ...);

в моем коде go У меня есть следующий массив int для представления моих идентификаторов:

idsToGet := []int{1,2}

Я полностью понимаю, что вы могли быобычно делайте sprintf и передайте тот идентификатор, который вы искали ... НО ...

Я чувствую, что есть разумный способ сделать это без перебора массива и сделать это как отдельныйвызов для каждого идентификатора ... через sprintf - есть ли способ сделать это одним вызовом - и мое предложение IN автоматически содержит все из моего массива?

Абсолютно новый для Go - пытался решитьэто в течение часа, у меня это работает для одного идентификатора - но не для кратных.

1 Ответ

0 голосов
/ 02 июня 2018

Вы не хотите использовать 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 обычным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...