# Руководство по работе с коннектором tarantool-python
## Содержание
1. [Подготовка](#Подготовка)
2. [Подключение к Tarantool](#Подключение-к-Tarantool)
3. [Работа с данными](#Работа-с-данными)
1. [Вставка данных](#Вставка-данных)
2. [Получение данных](#Получение-данных)
3. [Обновление данных](#Обновление-данных)
4. [Удаление данных](#Удаление-данных)
4. [Исполнение хранимых процедур](#Исполнение-хранимых-процедур)
## Подготовка
Перед началом работы [установим](https://github.com/tarantool/tarantool-python#download-and-install) библиотеку `tarantool-python`. Рекомендуется использовать `python3` и утилиту `pip3`.
Также запустим `tarantool` и обязательно выполним пункт с созданием базы данных, как показано [здесь](https://www.tarantool.io/ru/doc/1.10/book/getting_started/).
Если вы используете бинарный пакет `tarantool` (не Docker-образ), то не закрывайте консоль, в которой запущен `tarantool` -- она пригодится нам позднее.
Чтобы иметь возможность подключаться к `tarantool` в качестве администратора, сменим пароль пользователя `admin`:
```lua
box.schema.user.passwd('pass')
```
## Подключение к Tarantool
Для подключения к серверу достаточно выполнить следующее:
```python
>>> import tarantool
>>> connection = tarantool.connect("localhost", 3301)
```
Также при необходимости можно указать имя пользователя и пароль:
```python
>>> tarantool.connect("localhost", 3301, user=username, password=password)
```
По умолчанию используется пользователь `guest`.
## Работа с данными
Спейс -- это контейнер для кортежей. Чтобы обратиться к спейсу как к именованному объекту, можно воспользоваться функцией `connection.space`:
```python
>>> tester = connection.space('tester')
```
### Вставка данных
Для вставки нового кортежа в спейс воспользуемся функцией `insert`:
```python
>>> tester.insert((4, 'ABBA', 1972))
[4, 'ABBA', 1972]
```
### Получение данных
Сначала выберем кортеж по первичному ключу (в нашем примере первичный индекс -- это индекс `primary`, построенный по полю `id` в каждом кортеже). Воспользуемся функцией `select`:
```python
>>> tester.select(4)
[4, 'ABBA', 1972]
```
Теперь поищем кортежи по вторичному ключу. Для этого нужно указать номер или имя вторичного индекса.
Сначала сделаем запрос по номеру индекса:
```python
>>> tester.select('Scorpions', index=1)
[2, 'Scorpions', 2015]
```
Теперь сделаем аналогичный запрос по имени индекса и получим тот же результат:
```python
>>> tester.select('Scorpions', index='secondary')
[2, 'Scorpions', 2015]
```
А чтобы выбрать все кортежи из спейса, вызовем `select` без аргументов:
```python
>>> tester.select()
```
### Обновление данных
Обновим значение поля с помощью `update`:
```python
>>> tester.update(4, [('=', 1, 'New group'), ('+', 2, 2)])
```
Здесь мы обновляем значение поля `1` и увеличиваем значение поля `2` для кортежа с `id` = 4. Если кортежа с таким `id` нет, то `tarantool` вернет ошибку.
Теперь с помощью функции `replace` мы полностью заменим кортеж с совпадающим первичным ключом. Если кортежа с указанным первичным ключом не существует, то будет создан указанный кортеж.
```python
>>> tester.replace((4, 'New band', 2015))
```
Также мы можем обновлять данные с помощью функции `upsert`, которая работает аналогично `update`, но создает новый кортеж, если старый не был найден.
```python
>>> tester.upsert((4, 'Another band', 2000), [('+', 2, 5)])
```
Здесь мы увеличиваем на 5 значение поля `2` в кортеже с `id` = 4 -- или вставляем кортеж `(4, "Another band", 2000)`, если такого нет.
### Удаление данных
Чтобы удалить кортеж, нужно использовать `delete(primary_key)`:
```python
>>> tester.delete(4)
[4, 'New group', 2012]
```
Для удаления всех кортежей в спейсе (или всего спейса) нужно воспользоваться функцией `call`. Мы поговорим о ней подробнее в [следующем](#Исполнение-хранимых-процедур) разделе.
Чтобы удалить все кортежи в спейсе, нужно вызвать функцию `space:truncate`:
```python
>>> connection.call('box.space.tester:truncate', ())
```
Чтобы удалить спейс, необходимо вызвать функцию `space:drop`. Для выполнения следующей команды необходимо подключиться из-под пользователя `admin`:
```python
>>> connection.call('box.space.tester:drop', ())
```
## Исполнение хранимых процедур
Перейдем в терминал с запущенным `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
```
Чтобы вызвать из `python` функцию, описанную в `tarantool`, нам нужна функция `call`:
```python
>>> connection.call('sum', (3, 2))
5
```
Также мы можем передать Lua-код на выполнение. Для этого воспользуемся функцией `eval`:
```python
>>> connection.eval('return 4 + 5')
9
```