Вставка строки в 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 (?, ?)`,
"mug", 9.5,
)
if err != nil {
log.Fatal(err)
}
fmt.Println("inserted")
}
На экране "inserted". В таблице
одна строка: название "mug" и
цена 9.5, идентификатор выставил
движок сам.
Несколько строк добавляют повторным вызовом с тем же текстом запроса:
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)
}
items := []struct {
title string
price float64
}{
{"pen", 2.0},
{"book", 12.0},
}
for _, it := range items {
_, err = db.Exec(
`INSERT INTO goods (title, price) VALUES (?, ?)`,
it.title, it.price,
)
if err != nil {
log.Fatal(err)
}
}
fmt.Println("two rows")
}
Дана таблица:
goods: id=1 title="tea" price=5
Напишите запрос вставки второй строки
"cup" с ценой 7 без
указания id.
Даны значения:
title := "bag"
price := 15.0
Составьте текст INSERT для
orders с полями title,
qty, price и количеством
2 для этих переменных.
Скажите, почему название товара нельзя вшивать в текст запроса через сложение строк на Go.