Столбцы выборки в Go
В тексте SELECT перечисляют не
все поля подряд, а только те, что
нужны программе. Меньше данных тянется
из файла, проще держать в голове
порядок аргументов Scan.
Число переменных в Scan должно
совпадать с числом столбцов в списке
выборки. Имена столбцов в таблице
могут быть другими, главное их порядок
в запросе.
Выведем только названия товаров:
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)
}
rows, err := db.Query(`SELECT title FROM goods`)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var title string
err = rows.Scan(&title)
if err != nil {
log.Fatal(err)
}
fmt.Println(title)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
}
На экране "pen" и "book".
Столбцы id и price в
Scan не участвуют.
Можно взять пару полей из заказа:
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)
}
rows, err := db.Query(
`SELECT qty, price FROM orders`,
)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var qty int
var price float64
err = rows.Scan(&qty, &price)
if err != nil {
log.Fatal(err)
}
fmt.Println(qty, price)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
}
Дана таблица goods с тремя
столбцами. Составьте текст выборки,
который вернет только id и
price.
В SELECT указаны title,
затем price, а в Scan
сначала float64, потом string.
Скажите, что пойдет не так.
Даны строки:
orders: id=1 title="mug" qty=3 price=9.5
Напишите цикл, который печатает только
title, не читая id.