Условие в запросе в Go
Условие в тексте запроса оставляет только подходящие строки. Число в сравнении не вшивают в строку на Go: его передают параметром, как при вставке.
После отбора результат читают тем же циклом по курсору. Если строк не нашлось, цикл просто не выполнится ни разу, это не ошибка.
Подготовим товары и выведем дорогие:
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)
}
limit := 10.0
rows, err := db.Query(
`SELECT title, price FROM goods WHERE price > ?`,
limit,
)
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)
}
}
На экране одна строка "book"
с ценой 12. Порог 10
попал в запрос параметром limit.
Условие по идентификатору работает так же:
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 orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
qty INTEGER NOT NULL,
price REAL NOT NULL
)
`)
if err != nil {
log.Fatal(err)
}
_, err = db.Exec(
`INSERT INTO orders (title, qty, price) VALUES (?, ?, ?)`,
"mug", 3, 9.5,
)
if err != nil {
log.Fatal(err)
}
wantID := 1
rows, err := db.Query(
`SELECT title, qty FROM orders WHERE id = ?`,
wantID,
)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var title string
var qty int
err = rows.Scan(&title, &qty)
if err != nil {
log.Fatal(err)
}
fmt.Println(title, qty)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
}
Даны строки goods:
1 pen 2
2 book 12
3 mug 9
Скажите, сколько строк вернет условие
price < 10 при параметре 10
и строгом сравнении в SQL.
Дан порог maxQty равный 5.
Составьте текст выборки из orders
с полями title и qty,
где количество не больше параметра.
Скажите, будет ли ошибка, если условие ни одной строке не подошло и цикл не запустился.