# Руководство по работе с коннектором go-tarantool
## Содержание
1. [Подготовка](#Подготовка)
2. [Подключение к Tarantool](#Подключение-к-tarantool)
3. [Работа с данными](#Работа-с-данными)
1. [Вставка данных](#Вставка-данных)
2. [Получение данных](#Получение-данных)
3. [Обновление данных](#Обновление-данных)
4. [Удаление данных](#Удаление-данных)
4. [Исполнение хранимых процедур](#Исполнение-хранимых-процедур)
## Подготовка
Перед началом работы [установим](https://github.com/tarantool/go-tarantool#installation) библиотеку `go-tarantool`.
Также запустим `tarantool` и обязательно выполним пункт с созданием базы данных, как показано [здесь](https://www.tarantool.io/ru/doc/1.10/book/getting_started/).
Если вы используете бинарный пакет `tarantool` (не Docker-образ), то не закрывайте консоль, в которой запущен `tarantool` -- она пригодится нам позднее.
Чтобы иметь возможность подключаться к `tarantool` в качестве администратора, сменим пароль пользователя `admin`:
```lua
box.schema.user.passwd('pass')
```
## Подключение к Tarantool
Простая программа, выполняющая подключение к серверу, будет выглядеть так:
```go
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()
// Ваш код общения с базой
}
```
Также при необходимости можно указать имя пользователя и пароль:
```go
opts := tarantool.Opts{User: "username", Pass: "password"}
conn, err := tarantool.Connect("127.0.0.1:3301", opts)
...
```
По умолчанию используется пользователь `guest`.
## Работа с данными
### Вставка данных
Для вставки нового кортежа в спейс воспользуемся функцией `insert`:
```go
resp, err = conn.Insert("tester", []interface{}{4, "ABBA", 1972})
```
В этом примере в спейс `tester` вставляется кортеж `(4, "ABBA", 1972)`.
Код ответа и данные можно получить из структуры `tarantool.Response`:
```go
code := resp.Code
data := resp.Data
```
### Получение данных
Чтобы выбрать кортеж из спейса, воспользуемся функцией `Select`:
```go
resp, err = conn.Select("tester", "primary", 0, 1, tarantool.IterEq, []interface{}{4})
```
В этом примере мы ищем кортеж по первичному ключу с `offset` 0 и `limit` 1 в спейсе `tester`
(первичный индекс в нашем примере -- это индекс `primary`, построенный по полю `id` в каждом кортеже).
Теперь поищем по вторичному ключу:
```go
resp, err = conn.Select("tester", "secondary", 0, 1, tarantool.IterEq, []interface{}{"ABBA"})
```
А теперь выберем все кортежи из спейса:
```go
resp, err = conn.Select("tester", "primary", 0, tarantool.KeyLimit, tarantool.IterAll, []interface{}{})
```
### Обновление данных
Обновим значение поля с помощью `Update`:
```go
resp, err = conn.Update("tester", "primary", []interface{}{4}, []interface{}{[]interface{}{"+", 2, 3}})
```
Здесь мы увеличиваем на 3 значение поля `2` для кортежа с `id` = 4. Если кортежа с таким `id` нет, то `tarantool` вернет ошибку.
Теперь с помощью функции `Replace` мы полностью заменим кортеж с совпадающим первичным ключом. Если кортежа с указанным первичным ключом не существует, то будет создан указанный кортеж.
```go
resp, err = conn.Replace("tester", []interface{}{4, "New band", 2011})
```
Также мы можем обновлять данные с помощью функции `Upsert`, которая работает аналогично `Update`, но создает новый кортеж, если старый не был найден.
```go
resp, err = conn.Upsert("tester", []interface{}{4, "Another band", 2000}, []interface{}{[]interface{}{"+", 2, 5}})
```
Здесь мы увеличиваем на 5 значение третьего поля в кортеже с `id` = 4 -- или вставляем кортеж `(4, "Another band", 2000)`, если такого нет.
### Удаление данных
Чтобы удалить кортеж, воспользуемся функцией `сonnection.Delete`:
```go
resp, err = conn.Delete("tester", "primary", []interface{}{4})
```
Для удаления всех кортежей в спейсе (или всего спейса), нужно воспользоваться функцией `Call`. Мы поговорим о ней подробнее в [следующем](#Исполнение-хранимых-процедур) разделе.
Чтобы удалить все кортежи в спейсе, нужно вызвать функцию `space:truncate`:
```go
resp, err = conn.Call("box.space.tester:truncate", []interface{}{})
```
Чтобы удалить спейс, необходимо вызвать функцию `space:drop`. Для выполнения следующей команды необходимо подключиться из-под пользователя `admin`:
```go
resp, err = conn.Call("box.space.tester:drop", []interface{}{})
```
## Исполнение хранимых процедур
Перейдем в терминал с запущенным `tarantool` (о том, как установить удаленное подключение к `tarantool`, можно прочитать [здесь](https://www.tarantool.io/ru/doc/1.10/book/getting_started/using_binary/#connecting-remotely)) и напишем простую функцию на Lua:
```lua
function sum(a, b)
return a + b
end
```
Чтобы выполнить хранимую процедуру, описанную в `tarantool`, нам нужна функция `Call`:
```go
resp, err = conn.Call("sum", []interface{}{2, 3})
```
Также мы можем передать Lua-код на выполнение. Для этого воспользуемся функцией `Eval`:
```go
resp, err = connection.Eval("return 4 + 5", []interface{}{})
```