Подключение из PHP
Перед тем как идти дальше, выполним следующие действия:
Установим библиотеку
tarantool/client
.Запустим 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')
Для настройки подключения к серверу достаточно выполнить следующее:
use Tarantool\Client\Client;
require __DIR__.'/vendor/autoload.php';
$client = Client::fromDefaults();
Само подключение будет установлено при первом запросе. Также при необходимости можно указать имя пользователя и пароль:
$client = Client::fromOptions([
'uri' => 'tcp://127.0.0.1:3301',
'username' => '<username>',
'password' => '<password>'
]);
По умолчанию используется пользователь guest
.
Спейс — это контейнер для кортежей. Чтобы обратиться к спейсу как к именованному объекту, воспользуйтесь функцией getSpace
:
$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]
(Мы указываем index(1)
, потому что индексы в Tarantool нумеруются с нуля, а в данном случае мы обращаемся к индексу, который создавали вторым.)
Теперь сделаем аналогичный запрос по имени индекса и получим тот же результат:
$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));
Здесь значение поля 2
в кортеже с id = 4
увеличится на 5, — или же произойдет вставка кортежа (4, "Another band", 2000)
, если такого нет.
Чтобы удалить кортеж, нужно использовать delete(primary_key)
:
$result = $tester->delete([4]);
Для удаления всех кортежей в спейсе (или всего спейса целиком) нужно воспользоваться функцией call
. Мы поговорим о ней подробнее в следующем разделе.
Чтобы удалить все кортежи в спейсе, нужно вызвать функцию 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
Итак, теперь у нас есть функция, описанная в Tarantool. Чтобы вызвать ее из php
, нам нужна функция call
:
$result = $client->call('sum', 3, 2);
Также мы можем передать на выполнение любой Lua-код. Для этого воспользуемся функцией eval
:
$result = $client->evaluate('return 4 + 5');