Удаление строк в Go
Удаление убирает строки, которые подошли под условие. Без условия запрос может очистить всю таблицу, поэтому в учебных примерах условие пишут явно.
Как и при вставке или изменении, текст
запроса выполняют без курсора, а значения
в 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)
}
_, err = db.Exec(
`DELETE FROM goods WHERE id = ?`,
1,
)
if err != nil {
log.Fatal(err)
}
var count int
err = db.QueryRow(
`SELECT COUNT(*) FROM goods`,
).Scan(&count)
if err != nil {
log.Fatal(err)
}
fmt.Println(count)
}
На экране 1. Осталась только
строка с "book".
Очистим заказы с нулевым количеством:
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", 0, 9.5,
)
if err != nil {
log.Fatal(err)
}
_, err = db.Exec(
`INSERT INTO orders (title, qty, price) VALUES (?, ?, ?)`,
"pen", 2, 2.0,
)
if err != nil {
log.Fatal(err)
}
_, err = db.Exec(
`DELETE FROM orders WHERE qty = ?`,
0,
)
if err != nil {
log.Fatal(err)
}
rows, err := db.Query(`SELECT title FROM orders`)
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)
}
}
Даны строки goods:
1 pen 2
2 book 12
3 mug 9
Составьте запрос, который удалит строки
с ценой меньше 5, с параметром
порога.
Дана таблица orders с одной
строкой id=5. Напишите запрос
удаления только этой строки по id.
Скажите, чем опасен запрос DELETE
без WHERE для учебного файла
shop.db.