Создание таблицы в Go
Структуру таблицы задают одним запросом с именем таблицы и списком столбцов. У каждого столбца пишут имя и тип, для ключа часто ставят ограничение первичного ключа и автоувеличения.
Запросы без возвращаемых строк выполняют
через команду пакета database/sql,
которая не открывает курсор. Ошибку
сразу проверяют: при сбое таблица
может не появиться, а программа
не должна идти дальше.
Создадим таблицу goods в чистом файле:
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)
}
fmt.Println("table goods")
}
На экране "table goods". В файле
shop.db появилась пустая таблица
с тремя столбцами.
Рядом можно завести таблицу заказов с теми же правилами имен:
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(`
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)
}
fmt.Println("tables ready")
}
Дана таблица:
goods: id, title, price
Напишите запрос создания с типами
INTEGER для id,
TEXT для title,
REAL для price и
первичным ключом на id.
Даны столбцы таблицы orders:
id, title, qty,
price. Составьте полный текст
запроса CREATE TABLE для этой
таблицы.
Скажите, чем запрос создания таблицы
отличается от выборки по уже готовым
данным с точки зрения команды пакета
database/sql.