Изменение строк в 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)
}
newPrice := 2.5
_, err = db.Exec(
`UPDATE goods SET price = ? WHERE id = ?`,
newPrice, 1,
)
if err != nil {
log.Fatal(err)
}
var price float64
err = db.QueryRow(
`SELECT price FROM goods WHERE id = ?`,
1,
).Scan(&price)
if err != nil {
log.Fatal(err)
}
fmt.Println(price)
}
На экране 2.5. Условие по id
ограничило изменение одной строкой.
Переименуем позицию в заказе:
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)
}
_, err = db.Exec(
`UPDATE orders SET title = ? WHERE id = ?`,
"cup", 1,
)
if err != nil {
log.Fatal(err)
}
var title string
err = db.QueryRow(
`SELECT title FROM orders WHERE id = ?`,
1,
).Scan(&title)
if err != nil {
log.Fatal(err)
}
fmt.Println(title)
}
Даны строки goods:
1 pen 2
2 book 12
Составьте запрос, который поставит
цене 11 у строки с id
2.
Дан заказ id=1, qty=3.
Напишите запрос, который увеличит
qty до 5 для этой строки.
Скажите, изменятся ли строки, если
условие WHERE ни одной не
затронуло, и будет ли при этом ошибка.