Подключение из Go
Перед тем как идти дальше, выполним следующие действия:
Установим библиотеку
go-tarantool
.Запустим Tarantool (локально или в Docker) и обязательно создадим базу данных с тестовыми данными, как показано в предыдущем разделе:
box.cfg{listen = 3301} s = box.schema.space.create('tester') s:format({ {name = 'id', type = 'unsigned'}, {name = 'band_name', type = 'string'}, {name = 'year', type = 'unsigned'} }) s:create_index('primary', { type = 'hash', parts = {'id'} }) s:create_index('secondary', { type = 'hash', parts = {'band_name'} }) s:insert{1, 'Roxette', 1986} s:insert{2, 'Scorpions', 2015} s:insert{3, 'Ace of Base', 1993}
Важно
Не закрывайте окно терминала с запущенным Tarantool – оно пригодится нам позднее.
Чтобы иметь возможность подключаться к Tarantool в качестве администратора, сменим пароль пользователя
admin
:box.schema.user.passwd('pass')
Простая программа, выполняющая подключение к серверу, будет выглядеть так:
package main
import (
"fmt"
"github.com/tarantool/go-tarantool"
)
func main() {
conn, err := tarantool.Connect("127.0.0.1:3301", tarantool.Opts{
User: "admin",
Pass: "pass",
})
if err != nil {
log.Fatalf("Connection refused")
}
defer conn.Close()
// Ваш код общения с базой
}
По умолчанию используется пользователь 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"})
Наконец, было бы интересно сделать полную выборку даных из спейса. Но в рамках языка Go эта задача не решается в одну строчку. Пример такой программы вы можете посмотреть в отдельном разделе документации.
Более сложные примеры выборок можно увидеть тут: https://github.com/tarantool/go-tarantool#usage
Обновим значение поля с помощью Update
:
resp, err = conn.Update("tester", "primary", []interface{}{4}, []interface{}{[]interface{}{"+", 2, 3}})
Здесь значение поля 2
для кортежа с id = 4
мы увеличиваем на 3. Если кортежа с таким 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}})
Здесь значение третьего поля в кортеже с id = 4
мы увеличиваем на 5, — или же вставляем кортеж (4, "Another band", 2000)
, если такого нет.
To delete a tuple, use connection.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. Чтобы вызвать ее из go
, нам нужна функция Call
:
resp, err = conn.Call("sum", []interface{}{2, 3})
Также мы можем передать на выполнение любой Lua-код. Для этого воспользуемся функцией Eval
:
resp, err = connection.Eval("return 4 + 5", []interface{}{})
Есть еще два доступных коннектора от опенсорс-сообщества:
Чтобы подробнее ознакомиться с этими коннекторами, посмотрите таблицу сравнения функций всех доступных Go-коннекторов.