Try   HackMD

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

Содержание

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

Подготовка

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

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

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

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

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

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

Для подключения к серверу достаточно выполнить следующее:

require_once __DIR__.'/vendor/autoload.php';
use Tarantool\Client\Client;
$client = Client::fromDefaults();

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

$client = Client::fromOptions([
    'uri' => 'tcp://127.0.0.1:3301',
    'username' => '<username>',
    'password' => '<password>'
]);

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

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

Спейс это контейнер для кортежей. Чтобы обратиться к спейсу как к именованному объекту, можно воспользоваться функцией connection.space.

$tester = $client->getSpace('tester');

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

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

$result = $tester->insert([4, 'ABBA', 1972]);

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

Сначала выберем кортеж по первичному ключу (в нашем примере первичный индекс это индекс primary, построенный по полю id в каждом кортеже). Воспользуемся функцией select:

use Tarantool\Client\Schema\Criteria;

$result = $tester->select(Criteria::key([4]));
printf(json_encode($result));
[[4, 'ABBA', 1972]]

Теперь поищем кортежи по вторичному ключу. Для этого нужно указать номер или имя вторичного индекса.

Сначала сделаем запрос по номеру индекса:

$result = $tester->select(Criteria::index(1)->andKey(['Scorpions']));
printf(json_encode($result));
[2, 'Scorpions', 2015]

Теперь сделаем аналогичный запрос по имени индекса и получим тот же результат:

$result = $tester->select(Criteria::index('secondary')->andKey(['Scorpions']));
printf(json_encode($result));
[2, 'Scorpions', 2015]

А чтобы выбрать все кортежи из спейса, вызовем select без аргументов:

$result = $tester->select(Criteria::AllIterator());

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

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

use Tarantool\Client\Schema\Operations;

$result = $tester->update([4], Operations::set(1, 'New group')->andAdd(2, 2));

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

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

$result = $tester->replace([4, 'New band', 2015]);

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

use Tarantool\Client\Schema\Operations;

$tester->upsert([4, 'Another band', 2000], Operations::add(2, 5));

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

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

Чтобы удалить кортеж, нужно использовать delete(primary_key):

$result = $tester->delete([4]);

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

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

$result = $client->call('box.space.tester:truncate');

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

$result = $client->call('box.space.tester:drop');

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

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

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

Чтобы вызвать из php функцию, описанную в tarantool, нам нужна функция call:

$result = $client->call('sum', 3, 2);

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

$result = $client->evaluate('return 4 + 5');