Подключение из Python
Перед тем как идти дальше, выполним следующие действия:
Install the
tarantool
module. We recommend usingpython3
andpip3
.Start Tarantool (locally or in Docker) and make sure that you have created and populated a database as we suggested earlier:
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')
Для подключения к серверу достаточно выполнить следующее:
>>> import tarantool
>>> connection = tarantool.connect("localhost", 3301)
Также при необходимости можно указать имя пользователя и пароль:
>>> tarantool.connect("localhost", 3301, user=username, password=password)
По умолчанию используется пользователь guest
.
Спейс – это контейнер для кортежей. Чтобы обратиться к спейсу как к именованному объекту, воспользуемся функцией connection.space
:
>>> tester = connection.space('tester')
Для вставки нового кортежа в спейс воспользуемся функцией insert
:
>>> tester.insert((4, 'ABBA', 1972))
[4, 'ABBA', 1972]
Сначала выберем кортеж по первичному ключу (в нашем примере первичный индекс ––это индекс primary
, построенный по полю id
в каждом кортеже). Воспользуемся функцией select
:
>>> tester.select(4)
[4, 'ABBA', 1972]
Теперь поищем кортежи по вторичному ключу. Для этого нужно указать номер или имя вторичного индекса.
Сначала сделаем запрос по номеру индекса:
>>> tester.select('Scorpions', index=1)
[2, 'Scorpions', 2015]
(We say index=1
because index numbers in Tarantool start with 0,
and we’re using our second index here.)
Теперь сделаем аналогичный запрос по имени индекса и получим тот же результат:
>>> tester.select('Scorpions', index='secondary')
[2, 'Scorpions', 2015]
А чтобы выбрать все кортежи из спейса, вызовем select
без аргументов:
>>> tester.select()
Обновим значение поля с помощью update
:
>>> tester.update(4, [('=', 1, 'New group'), ('+', 2, 2)])
This updates the value of field 1
and increases the value of field 2
in the tuple with id = 4
. If a tuple with this id
doesn’t exist,
Tarantool will return an error.
Теперь с помощью функции replace
мы полностью заменим кортеж с совпадающим первичным ключом. Если кортежа с указанным первичным ключом не существует, то эта операция ни к чему не приведет.
>>> tester.replace((4, 'New band', 2015))
Также мы можем обновлять данные с помощью функции upsert
, которая работает аналогично update
, но создает новый кортеж, если старый не был найден.
>>> tester.upsert((4, 'Another band', 2000), [('+', 2, 5)])
This increases by 5 the value of field 2
in the tuple with id = 4
, or
inserts the tuple (4, "Another band", 2000)
if a tuple with this id
doesn’t exist.
Чтобы удалить кортеж, нужно использовать delete(primary_key)
:
>>> tester.delete(4)
[4, 'New group', 2012]
Для удаления всех кортежей в спейсе (или всего спейса целиком) нужно воспользоваться функцией call
. Мы поговорим о ней подробнее в следующем разделе.
Чтобы удалить все кортежи в спейсе, нужно вызвать функцию space:truncate
:
>>> connection.call('box.space.tester:truncate', ())
Чтобы удалить весь спейс, нужно вызвать функцию space:drop
. Для выполнения следующей команды необходимо подключиться из-под пользователя admin
:
>>> connection.call('box.space.tester:drop', ())
Перейдем в терминал с запущенным Tarantool.
Примечание
О том, как установить удаленное подключение к Tarantool, можно прочитать здесь:
Напишем простую функцию на Lua:
function sum(a, b)
return a + b
end
Итак, теперь у нас есть функция, описанная в Tarantool. Чтобы вызвать ее из python
, нам нужна функция call
:
>>> connection.call('sum', (3, 2))
5
Также мы можем передать на выполнение любой Lua-код. Для этого воспользуемся функцией eval
:
>>> connection.eval('return 4 + 5')
9