Python
Примеры на GitHub: sample_db, python
tarantool-python – официальный коннектор Python для Tarantool. Он не входит в состав репозитория Tarantool и должен устанавливаться отдельно.
В этом руководстве показано, как использовать библиотеку tarantool-python для создания Python-скрипта, который подключается к удалённому экземпляру Tarantool, выполняет операции CRUD и вызывает хранимую процедуру. Полная документация по пакету доступна здесь: Клиентская библиотека Python для Tarantool.
Перед созданием и запуском клиентского Python-приложения необходимо запустить приложение sample_db с помощью команды tt start:
$ tt start sample_db
Теперь можно создать клиентское Python-приложение, которое будет выполнять запросы к этой базе данных.
Перед началом работы убедитесь, что на вашем компьютере установлен Python.
-
Создайте каталог
helloдля вашего приложения и перейдите в него:$ mkdir hello$ cd hello -
Создайте и активируйте виртуальное окружение Python:
$ python -m venv .venv$ source .venv/bin/activate -
Установите модуль
tarantool:$ pip install tarantool -
Внутри каталога
helloсоздайте файлhello.pyдля кода приложения.
В файле hello.py импортируйте пакет tarantool:
import tarantool# Connect to the databaseconn = tarantool.Connection(host='127.0.0.1',port=3301,user='sampleuser',password='123456')# Insert datatuples = [(1, 'Roxette', 1986),(2, 'Scorpions', 1965),(3, 'Ace of Base', 1987),(4, 'The Beatles', 1960)]print("Inserted tuples:")for tuple in tuples:response = conn.insert(space_name='bands', values=tuple)print(response[0])# Select by primary keyresponse = conn.select(space_name='bands', key=1)print('Tuple selected by the primary key value:', response[0])# Select by secondary keyresponse = conn.select(space_name='bands', key='The Beatles', index='band')print('Tuple selected by the secondary key value:', response[0])# Updateresponse = conn.update(space_name='bands',key=2,op_list=[('=', 'band_name', 'Pink Floyd')])print('Updated tuple:', response[0])# Upsertconn.upsert(space_name='bands',tuple_value=(5, 'The Rolling Stones', 1962),op_list=[('=', 'band_name', 'The Doors')])# Replaceresponse = conn.replace(space_name='bands', values=(1, 'Queen', 1970))print('Replaced tuple:', response[0])# Deleteresponse = conn.delete(space_name='bands', key=5)print('Deleted tuple:', response[0])# Callresponse = conn.call('get_bands_older_than', 1966)print('Stored procedure result:', response[0])# Close connectionconn.close()print('Connection is closed')
Добавьте следующий код:
# Connect to the databaseconn = tarantool.Connection(host='127.0.0.1',port=3301,user='sampleuser',password='123456')
Этот код устанавливает подключение к работающему экземпляру Tarantool от имени пользователя sampleuser. Объект conn можно
использовать для выполнения CRUD-запросов и вызова хранимых процедур.
Добавьте следующий код, чтобы вставить четыре кортежа в спейс bands:
# Insert datatuples = [(1, 'Roxette', 1986),(2, 'Scorpions', 1965),(3, 'Ace of Base', 1987),(4, 'The Beatles', 1960)]print("Inserted tuples:")for tuple in tuples:response = conn.insert(space_name='bands', values=tuple)print(response[0])
Connection.insert() используется для вставки кортежа в спейс.
Чтобы получить кортеж по заданному значению первичного ключа, используйте Connection.select():
# Select by primary keyresponse = conn.select(space_name='bands', key=1)print('Tuple selected by the primary key value:', response[0])
Также можно получить кортеж по значению указанного индекса с помощью аргумента index:
# Select by secondary keyresponse = conn.select(space_name='bands', key='The Beatles', index='band')print('Tuple selected by the secondary key value:', response[0])
Connection.update() можно использовать для обновления кортежа, идентифицированного первичным ключом, следующим образом:
# Updateresponse = conn.update(space_name='bands',key=2,op_list=[('=', 'band_name', 'Pink Floyd')])print('Updated tuple:', response[0])
Connection.upsert() обновляет существующий кортеж или вставляет новый. В примере ниже вставляется новый кортеж:
# Upsertconn.upsert(space_name='bands',tuple_value=(5, 'The Rolling Stones', 1962),op_list=[('=', 'band_name', 'The Doors')])
В этом примере Connection.replace() удаляет существующий кортеж и вставляет новый:
# Replaceresponse = conn.replace(space_name='bands', values=(1, 'Queen', 1970))print('Replaced tuple:', response[0])
Connection.delete() в примере ниже удаляет кортеж, значение первичного ключа которого равно 5:
# Deleteresponse = conn.delete(space_name='bands', key=5)print('Deleted tuple:', response[0])
Для вызова хранимой процедуры используйте Connection.call():
# Callresponse = conn.call('get_bands_older_than', 1966)print('Stored procedure result:', response[0])
Метод Connection.close() можно использовать для закрытия подключения, когда оно больше не нужно:
# Close connectionconn.close()print('Connection is closed')
Чтобы запустить получившееся приложение, передайте имя скрипта команде python:
$ python hello.pyInserted tuples:[1, 'Roxette', 1986][2, 'Scorpions', 1965][3, 'Ace of Base', 1987][4, 'The Beatles', 1960]Tuple selected by the primary key value: [1, 'Roxette', 1986]Tuple selected by the secondary key value: [4, 'The Beatles', 1960]Updated tuple: [2, 'Pink Floyd', 1965]Replaced tuple: [1, 'Queen', 1970]Deleted tuple: [5, 'The Rolling Stones', 1962]Stored procedure result: [[2, 'Pink Floyd', 1965], [4, 'The Beatles', 1960]]Connection is closed
Последнее обновление: сентябрь 2023
Также существуют следующие коннекторы Python, разработанные сообществом:
- asynctnt с поддержкой asyncio.
- aiotarantool также с поддержкой asyncio, нет активной поддержки.
- gtarantool с поддержкой gevent, нет активной поддержки.
В таблице ниже приведено сравнение возможностей asynctnt и tarantool-python.
Параметр | ||
|---|---|---|
Лицензия | Apache License 2.0 | BSD-2 |
Поддерживается | Да | Да |
Известные проблемы | Нет | Нет |
Документация | Да (github.io) | Да (readthedocs и tarantool.io) |
Тестирование / CI / CD | GitHub Actions | GitHub Actions |
Звёзды на GitHub | 73 | 92 |
Статический анализ | Да (Flake8) | Да (Flake8, Pylint) |
Пакетирование | ||
Покрытие кода | Да | Да |
Поддержка асинхронного режима | Да, asyncio | Нет |
Поддержка пакетной обработки | Нет | Да (через API CRUD) |
Перезагрузка схемы | Да (автоматически, см. auto_refetch_schema) | Да (автоматически) |
Имена спейсов / индексов | Да | Да |
Доступ к полям кортежа по именам | Да | Нет |
Да | Да | |
Да | Нет (issue #163) | |
Да (в полях MP_BIN) | Да | |
Да | Да | |
Да | Да | |
Да | Да | |
Да | Да | |
Нет (issue #30) | Да | |
Да | Да | |
Нет | Нет | |
Нет | Нет | |
Да | Да | |
Нет | Да | |
Прозрачные повторные попытки запросов | Нет | Нет |
Прозрачное повторное подключение | Автопереподключение | Да ( reconnect_max_attempts, reconnect_delay), проверка работоспособности соединения |
Пул соединений | Нет | Да (с обнаружением мастера) |
Нет | ||
Нет (issue #22) | Да |