Try  HackMD Logo HackMD

Руководство по работе с коннектором go-tarantool

Содержание

  1. Подготовка
  2. Подключение к Tarantool
  3. Работа с данными
    1. Вставка данных
    2. Получение данных
    3. Обновление данных
    4. Удаление данных
  4. Исполнение хранимых процедур

Подготовка

Перед началом работы установим библиотеку go-tarantool.

Также запустим tarantool и обязательно выполним пункт с созданием базы данных, как показано здесь.

Если вы используете бинарный пакет tarantool (не Docker-образ), то не закрывайте консоль, в которой запущен tarantool она пригодится нам позднее.

Чтобы иметь возможность подключаться к tarantool в качестве администратора, сменим пароль пользователя admin:

box.schema.user.passwd('pass')

Подключение к Tarantool

Простая программа, выполняющая подключение к серверу, будет выглядеть так:

package main

import (
    "fmt"

    "github.com/tarantool/go-tarantool"
)

func main() {
    conn, err := tarantool.Connect("127.0.0.1:3301", tarantool.Opts{})

    if err != nil {
        fmt.Println("Connection refused")
    }

    defer conn.Close()

    // Ваш код общения с базой
}

Также при необходимости можно указать имя пользователя и пароль:

opts := tarantool.Opts{User: "username", Pass: "password"}
conn, err := tarantool.Connect("127.0.0.1:3301", opts)
...

По умолчанию используется пользователь guest.

Работа с данными

Вставка данных

Для вставки нового кортежа в спейс воспользуемся функцией insert:

resp, err = conn.Insert("tester", []interface{}{4, "ABBA", 1972})

В этом примере в спейс tester вставляется кортеж (4, "ABBA", 1972).

Код ответа и данные можно получить из структуры tarantool.Response:

code := resp.Code
data := resp.Data

Получение данных

Чтобы выбрать кортеж из спейса, воспользуемся функцией Select:

resp, err = conn.Select("tester", "primary", 0, 1, tarantool.IterEq, []interface{}{4})

В этом примере мы ищем кортеж по первичному ключу с offset 0 и limit 1 в спейсе tester
(первичный индекс в нашем примере это индекс primary, построенный по полю id в каждом кортеже).

Теперь поищем по вторичному ключу:

resp, err = conn.Select("tester", "secondary", 0, 1, tarantool.IterEq, []interface{}{"ABBA"})

А теперь выберем все кортежи из спейса:

resp, err = conn.Select("tester", "primary", 0, tarantool.KeyLimit, tarantool.IterAll, []interface{}{})

Обновление данных

Обновим значение поля с помощью Update:

resp, err = conn.Update("tester", "primary", []interface{}{4}, []interface{}{[]interface{}{"+", 2, 3}})

Здесь мы увеличиваем на 3 значение поля 2 для кортежа с id = 4. Если кортежа с таким id нет, то tarantool вернет ошибку.

Теперь с помощью функции Replace мы полностью заменим кортеж с совпадающим первичным ключом. Если кортежа с указанным первичным ключом не существует, то будет создан указанный кортеж.

resp, err = conn.Replace("tester", []interface{}{4, "New band", 2011})

Также мы можем обновлять данные с помощью функции Upsert, которая работает аналогично Update, но создает новый кортеж, если старый не был найден.

resp, err = conn.Upsert("tester", []interface{}{4, "Another band", 2000}, []interface{}{[]interface{}{"+", 2, 5}})

Здесь мы увеличиваем на 5 значение третьего поля в кортеже с id = 4 или вставляем кортеж (4, "Another band", 2000), если такого нет.

Удаление данных

Чтобы удалить кортеж, воспользуемся функцией сonnection.Delete:

resp, err = conn.Delete("tester", "primary", []interface{}{4})

Для удаления всех кортежей в спейсе (или всего спейса), нужно воспользоваться функцией Call. Мы поговорим о ней подробнее в следующем разделе.

Чтобы удалить все кортежи в спейсе, нужно вызвать функцию space:truncate:

resp, err = conn.Call("box.space.tester:truncate", []interface{}{})

Чтобы удалить спейс, необходимо вызвать функцию space:drop. Для выполнения следующей команды необходимо подключиться из-под пользователя admin:

resp, err = conn.Call("box.space.tester:drop", []interface{}{})

Исполнение хранимых процедур

Перейдем в терминал с запущенным tarantool (о том, как установить удаленное подключение к tarantool, можно прочитать здесь) и напишем простую функцию на Lua:

function sum(a, b)
    return a + b
end

Чтобы выполнить хранимую процедуру, описанную в tarantool, нам нужна функция Call:

resp, err = conn.Call("sum", []interface{}{2, 3})

Также мы можем передать Lua-код на выполнение. Для этого воспользуемся функцией Eval:

resp, err = connection.Eval("return 4 + 5", []interface{}{})