Параметры запроса в 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.