Go: SQLite

SQLite — это встраиваемая библиотека, написанная на Си, в которой реализован движок реляционной СУБД с поддержкой многих вещей из стандарта SQL 92. При этом вся база данных хранится в единственном стандартном файле на машине, на которой исполняется программа.

SQLite тщательно заботится о целостности данных в БД (ACID), реализуя механизм изменения данных через транзакции. Транзакция либо полностью накатывается, либо полностью откатывается. Промежуточных состояний быть не может. Если вы не используете транзакции явно (BEGIN; ...; COMMIT;), то всегда создается неявная транзакция. Она стартует перед выполнением команды и коммитится сразу после. Отсюда жалобы на «медленность» SQLite. SQLite может вставлять и до 50 тыс записей в секунду, но фиксирует транзакции он значительно медленнее. Именно поэтому, не получается вставлять записи быстро, используя неявную транзакцию.

Более детальную информацию о SQLite о поддержке имя SQL и другом можно найти на официальном сайте. Сейчас же давайте рассмотрим как интегрировать SQLite в свое приложение на языке Go. Один из популярных способов это использование mattn/go-sqlite3. Для этого установим библиотеку:

go get github.com/mattn/go-sqlite3

В коде работа с SQLite происходит через database/sql с подключенным ранее установленным нами драйвером.

import (
  "database/sql"
  _ "github.com/mattn/go-sqlite3"
)

Открываем базу данных:

dbh, err := sql.Open("sqlite3", "file:./database.db?cache=shared")
if err != nil {
  panic(err)
}
defer dbh.Close()

Создаем таблицу people, если она не существует:

table := `CREATE TABLE IF NOT EXISTS people (
id INTEGER PRIMARY KEY, 
firstname TEXT, 
lastname TEXT
)`

sth1, e1 := dbh.Prepare(table)
if e1 != nil {
  panic(e1)
}
defer sth1.Close()

sth1.Exec()

Добавляем запись о человеке в таблицу:

sth2, e2 := dbh.Prepare("INSERT INTO people (firstname, lastname) VALUES (?, ?)")
if e2 != nil {
  panic(e2)
}
defer sth2.Close()

sth2.Exec("Mikhail", "K.")

Получаем все записи из таблицы:

rows, e3 := dbh.Query("SELECT id, firstname, lastname FROM people")
if e3 != nil {
  panic(e3)
}
defer rows.Close()

var id int
var firstname string
var lastname string

for rows.Next() {
  rows.Scan(&id, &firstname, &lastname)
  fmt.Println(strconv.Itoa(id) + ": " + firstname + " " + lastname)
}

Ниже преден пример всей программы:

package main

import (
  "database/sql"
  "fmt"
  "strconv"

  _ "github.com/mattn/go-sqlite3"
)

func main() {

  dbh, err := sql.Open("sqlite3", "file:./database.db?cache=shared")
  if err != nil {
    panic(err)
     }
  defer dbh.Close()

  table := `CREATE TABLE IF NOT EXISTS people (
id INTEGER PRIMARY KEY, 
firstname TEXT, 
lastname TEXT
)`

  sth1, e1 := dbh.Prepare(table)
  if e1 != nil {
    panic(e1)
  }
  defer sth1.Close()

  sth1.Exec()

  sth2, e2 := dbh.Prepare("INSERT INTO people (firstname, lastname) VALUES (?, ?)")
  if e2 != nil {
    panic(e2)
  }
  defer sth2.Close()

  sth2.Exec("Mikhail", "K.")


  rows, e3 := dbh.Query("SELECT id, firstname, lastname FROM people")
  if e3 != nil {
    panic(e3)
  }
  defer rows.Close()

  var id int
  var firstname string
  var lastname string

  for rows.Next() {
    rows.Scan(&id, &firstname, &lastname)
    fmt.Println(strconv.Itoa(id) + ": " + firstname + " " + lastname)
   }
}

05.06.2019









 
архив

подписка