Ошибка запроса в Go
Ошибку запроса нельзя откладывать только на конец цикла. Команда выполнения без курсора возвращает ошибку сразу, и ее проверяют до любых дальнейших шагов.
У выборки две точки проверки: сразу
после открытия курсора и после обхода
строк. Пропуск первой проверки оставит
программу с nil курсором и паникой
на Next.
Поймаем синтаксическую ошибку в тексте изменения:
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(
`UPDTE goods SET price = ? WHERE id = ?`,
3.0, 1,
)
if err != nil {
fmt.Println("exec error")
return
}
fmt.Println("ok")
}
На экране "exec error". Опечатка
в команде не дошла до выборки.
Ошибку открытия выборки тоже проверяют до цикла:
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)
}
rows, err := db.Query(
`SELECT title, price FROM goodss`,
)
if err != nil {
fmt.Println("query error")
return
}
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)
}
}
Дан фрагмент: открыли выборку, ошибку
не проверили, сразу пошли в цикл
Next. Скажите, чем это
опасно.
Запрос вставки вернул ошибку, но программа вызвала выборку всех строк. Скажите, что нужно сделать сразу после неудачной вставки.
Цикл Next завершился без ошибок
на Scan. Скажите, зачем все
равно вызывают проверку ошибки
курсора после цикла.