Sobes.tech
Назад к вопросам
Middle — Middle+
82

Какие подходы существуют для формирования SQL-запроса SELECT на лету с возможностью динамического изменения условий и параметров?

Компании, где спрашивали
Кадровое агентство BWG

Ответ от нейросети

sobes.tech AI

Для динамического формирования SQL-запроса SELECT в Go существуют несколько подходов:

  1. Конкатенация строк — самый простой, но небезопасный способ, подверженный SQL-инъекциям.

  2. Использование параметризованных запросов с пакетами database/sql и передачей аргументов через ? или $1.

  3. Строители запросов (query builders) — библиотеки, которые позволяют программно формировать запросы с условиями, сортировками и т.д.

Пример с использованием библиотеки Squirrel:

import (
    "github.com/Masterminds/squirrel"
    "database/sql"
    _ "github.com/lib/pq"
)

func buildQuery(age int, active bool) (string, []interface{}, error) {
    qb := squirrel.Select("id", "name").From("users")

    if age > 0 {
        qb = qb.Where(squirrel.Gt{"age": age})
    }
    if active {
        qb = qb.Where(squirrel.Eq{"active": true})
    }

    return qb.ToSql()
}

func main() {
    db, _ := sql.Open("postgres", "connection_string")
    query, args, _ := buildQuery(30, true)
    rows, _ := db.Query(query, args...)
    defer rows.Close()
    // обработка результатов
}

Такой подход позволяет динамически добавлять условия и параметры, избегая ошибок и SQL-инъекций.

Также можно использовать ORM или собственные обертки для построения запросов.