Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpDbPm 206 of 280 menu
◀ ▶

Параметры запроса в Go

В тексте запроса вместо конкретного числа или строки ставят знак вопроса. Реальное значение идет следующим аргументом команды выполнения или выборки. Драйвер подставит его безопасно, не смешивая с командным текстом.

Для SQLite из выбранного модуля знак вопроса работает и во вставке, и в условии, и в изменении. Порядок знаков совпадает с порядком аргументов слева направо по тексту запроса.

Вставим строку, где название и цена идут параметрами:

package main import ( "database/sql" "fmt" "log" "os" _ "modernc.org/sqlite" ) func main() { os.Remove("shop.db") db, err := sql.Open("sqlite", "shop.db") if err != nil { log.Fatal(err) } defer db.Close() err = db.Ping() if err != nil { log.Fatal(err) } _, err = db.Exec(` CREATE TABLE goods ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, price REAL NOT NULL ) `) if err != nil { log.Fatal(err) } title := " lamp " price := 20.0 _, err = db.Exec( `INSERT INTO goods (title, price) VALUES (?, ?)`, title, price, ) if err != nil { log.Fatal(err) } fmt.Println("saved", title, price) }

Пробелы в title сохранятся как есть: параметр не обрезает строку. Знак вопроса в SQL не печатается на экран.

В выборке параметр тоже ставят в WHERE, а значение передают после текста запроса:

package main import ( "database/sql" "fmt" "log" "os" _ "modernc.org/sqlite" ) func main() { os.Remove("shop.db") db, err := sql.Open("sqlite", "shop.db") if err != nil { log.Fatal(err) } defer db.Close() err = db.Ping() if err != nil { log.Fatal(err) } _, err = db.Exec(` CREATE TABLE goods ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, price REAL NOT NULL ) `) if err != nil { log.Fatal(err) } _, err = db.Exec( `INSERT INTO goods (title, price) VALUES (?, ?)`, "pen", 2.0, ) if err != nil { log.Fatal(err) } _, err = db.Exec( `INSERT INTO goods (title, price) VALUES (?, ?)`, "book", 12.0, ) if err != nil { log.Fatal(err) } minPrice := 5.0 rows, err := db.Query( `SELECT title, price FROM goods WHERE price >= ?`, minPrice, ) if err != nil { log.Fatal(err) } defer rows.Close() for rows.Next() { var title string var price float64 err = rows.Scan(&title, &price) if err != nil { log.Fatal(err) } fmt.Println(title, price) } err = rows.Err() if err != nil { log.Fatal(err) } }

Дан запрос с двумя значениями:

INSERT INTO orders (title, qty, price) VALUES (?, ?, ?)

Перечислите аргументы для строки "bag", количества 1 и цены 15 в нужном порядке.

Даны переменные:

a := 3 b := 10

В запросе WHERE id BETWEEN ? AND ? скажите, какой аргумент соответствует нижней границе.

Скажите, чем подстановка через знак вопроса отличается от вставки числа прямо в строку запроса на Go.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить