# Руководство по работе с коннектором 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 ```