Sobes.tech
Middle — Middle+

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

sobes.tech AI

Отговор от 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 или собствени обвивки за създаване на заявки.