Picopyn¶
В данном разделе приведено описание Python-драйвера для работы с СУБД Picodata.
Общие сведения¶
Драйвер Picopyn представляет собой пакет для Python, реализующий подключение и работу с СУБД Picodata из Python-приложений.
Picopyn предоставляет как асинхронный, так и синхронный интерфейс.
Дополнительные примеры и подробности реализации можно найти на странице Readthedocs для Picopyn.
Версии драйвера Picopyn требуют определённых версий СУБД Picodata. Ниже показана таблица совместимости версий:
| Picopyn | Picodata |
|---|---|
| 0.1.1 | >=25.2.1, <25.4.4 |
| 0.2.0 | >=25.4.4, <25.5.1 |
| 1.0.0 | >=25.5.1, <26.1.x |
| 2.0.0 | >=26.1.1, <26.2.x |
| ⚠️ В разработке | 26.2.x |
Поддерживаемые функции¶
Драйвер Picopyn обеспечивает следующую функциональность:
- поддержка пула подключений, возможность настраивать размер пула
- опциональное автоматическое обнаружение узлов кластера Picodata
- возможность выбора стратегии балансировки подключений
- асинхронный API, основанный на asyncpg
- маршрутизация запросов с учётом распределения данных по шардам (см. ограничения и подробности в документации)
- автоматическая подстройка пула соединений под актуальную топологию кластера (см. ограничения и подробности в документации)
- синхронный DBAPI-совместимый API, основанный на psycopg
Подключение¶
Установите драйвер из PYPI:
pip install picopyn
Или из исходного кода:
git clone https://git.picodata.io/core/drivers/picopyn.git
cd picopyn
pip install -e .
Примеры использования¶
Использование асинхронного драйвера¶
import asyncio
from picopyn.asynchronous import Client
async def main():
# create and connect client to the picodata cluster
client = Client(dsn="postgresql://admin:pass@localhost:5432")
await client.connect()
# execute DDL operations
await client.execute('''
CREATE TABLE "warehouse" (id INTEGER NOT NULL, item TEXT NOT NULL, PRIMARY KEY (id)) USING memtx DISTRIBUTED BY (id) OPTION (TIMEOUT = 3.0);
''')
# execute DML/DQL operations
await client.execute('INSERT INTO "warehouse" VALUES ($1::int, $2::varchar)', 1, "test")
rows = await client.fetch('SELECT * FROM "warehouse"')
print(rows)
await client.close()
asyncio.run(main())
Использование синхронного драйвера¶
from picopyn.synchronous import connect
# create and connect to the picodata cluster
with connect("postgresql://admin:pass@localhost:5432") as conn:
cur = conn.cursor()
# execute DDL operations
cur.execute('''
CREATE TABLE "warehouse" (id INTEGER NOT NULL, item TEXT NOT NULL, PRIMARY KEY (id)) USING memtx DISTRIBUTED BY (id) OPTION (TIMEOUT = 3.0);
''')
# execute DML/DQL operations
cur.execute('INSERT INTO "warehouse" VALUES (%s, %s)', (1, "test"))
cur.execute('SELECT * FROM "warehouse"')
print(cur.fetchall())
Изменение параметров¶
Параметры асинхронного клиента¶
Используйте следующие параметры для класса Client:
dsn(str) — имя источника данных (data source name) в форматеpostgresql://user:pass@host:portbalance_strategy(callable, optional) — стратегия балансировки подключений. По умолчанию используетсяround-robinpool_size— размер используемого пула подключенийconnect_kwargs— дополнительные параметры подключения в форматеключ = значение
Пример использования параметров:
>>> client = Client(
... dsn="postgresql://admin:pass@localhost:5432",
... balance_strategy=random_strategy,
... pool_size=4
... )
Задайте стратегию балансировки подключений в блоке следующего вида:
def random_strategy(connections):
... import random
... return random.choice(connections)
Параметры асинхронного пула подключений¶
Используйте следующие параметры для класса Pool:
dsn(str) — имя источника данных (data source name) в форматеpostgresql://user:pass@host:portbalance_strategy(callable, optional) — стратегия балансировки нагрузки. По умолчанию используетсяround-robinmax_size(int) — максимальное число подключений в пуле. Значение не может быть меньше 1enable_discovery(bool) — признак автоматического обнаружения узлов кластера Picodata. При значенииTrueдрайвер будет искать доступные узлы кластера, приFalse— использовать только указанный вdsnузелconnect_kwargs— дополнительные параметры подключения в форматеключ = значение
Пример использования параметров:
>>> pool = Pool(
... dsn="postgresql://admin:pass@localhost:5432",
... balance_strategy=random_strategy,
... max_size=10,
... enable_discovery=True
... )