用于python/asyncio的快速tarantool数据库连接器。

asynctnt的Python项目详细描述


Build StatusPyPIMaintainability<;图片 src=“https://avatars2.githubusercontent.com/u/2344919?v=2&s=250” align=“right”>;

asynctnt是一个高性能的Tarantool python/asyncio的数据库连接器库。它的灵感来自 asyncpg模块。

AsyncTnt需要Python3.5或更高版本,并支持Tarantool 版本1.6+。

安装

使用PIP安装:

$ pip install asynctnt

文档

文件可用 here

主要功能

  • 支持Tarantool支持的所有基本请求。这个 包括:insertselectupdateupsertevalsql(用于tarantool 2.x)、callcall16注意:对于 “call16”与“call”的区别请参考塔兰托 文档。
  • schema在建立连接时获取,因此可以使用 空格和索引名称,而不是它们的id。
  • 架构自动重新蚀刻。如果塔兰托尔的模式改变了, asynctnt重新读取。
  • 自动重新连接。如果由于某种原因失去连接-asynctnt 将启动自动重新连接过程(经授权和 当然是模式获取)。
  • 能够对元组使用dict并将字段名用作dml中的键 请求(select、insert、replace、delete、update、upsert)。这是 只有在tarantool中指定space.format时才可能。字段名 也可用于更新操作,而不是字段号。 此外,元组被解码成特殊的结构,这些结构可以起作用 作为tuples或通过dicts使用适当的api。
  • 所有请求都支持timeout值的规范,因此如果 请求执行时间过长,引发asyncio.timeouterror。它 大大简化了代码,因为您不需要使用 asyncio.wait_for(...)东西了。

基本用法

塔兰托配置:

box.cfg{listen='127.0.0.1:3301'}box.once('v1',function()box.schema.user.grant('guest','read,write,execute','universe')locals=box.schema.create_space('tester')s:create_index('primary')s:format({{name='id',type='unsigned'},{name='name',type='string'},})end)

python代码:

importasyncioimportasynctntasyncdefmain():conn=asynctnt.Connection(host='127.0.0.1',port=3301)awaitconn.connect()foriinrange(1,11):awaitconn.insert('tester',[i,'hello{}'.format(i)])data=awaitconn.select('tester',[])first_tuple=data[0]print('tuple:',first_tuple)print(f'tuple[0]: {first_tuple[0]}; tuple["id"]: {first_tuple["id"]}')print(f'tuple[1]: {first_tuple[1]}; tuple["name"]: {first_tuple["name"]}')awaitconn.disconnect()asyncio.run(main())

标准输出:

(注意,可以通过索引或 他们的名字)

tuple: <TarantoolTuple id=1 name='hello1'>
tuple[0]: 1; tuple["id"]: 1
tuple[1]: hello1; tuple["name"]: hello1

SQL

Tarantool 2为数据库提供了一个SQL接口。你很容易 通过asynctnt

使用SQL
box.cfg{listen='127.0.0.1:3301'}box.once('v1',function()box.schema.user.grant('guest','read,write,execute','universe')box.sql.execute([[
        create table users (
            id int primary key,
            name text
        )
    ]])end)
importasyncioimportasynctntasyncdefmain():conn=asynctnt.Connection(host='127.0.0.1',port=3301)awaitconn.connect()awaitconn.sql("insert into users (id, name) values (1, 'James Bond')")awaitconn.sql("insert into users (id, name) values (2, 'Ethan Hunt')")data=awaitconn.sql('select * from users')forrowindata:print(row)awaitconn.disconnect()asyncio.run(main())

标准输出:

<TarantoolTuple ID=1 NAME='James Bond'>
<TarantoolTuple ID=2 NAME='Ethan Hunt'>

性能

在下面的所有基准上wal_mode = none

顺序

运行40K请求时的RPS(无^{TT16}$):

Requestaiotarantoolasynctnt
ping5010.609037.07
call4575.989113.32
eval4096.328921.95
select4063.159681.12
insert4038.049332.21
update3945.1210532.75

运行40K请求时的RPS(使用uvloop):

Requestaiotarantoolasynctnt
ping7204.3120372.59
call6723.5817279.21
eval7001.2716642.67
select7028.0317730.24
insert7054.0617384.26
update6618.0115990.12

平行协程

在300个并行协程中运行200k个请求的rps(nouvloop):

Requestaiotarantoolasynctnt
ping32946.2544090.53
call29005.9341129.16
eval28792.8444097.02
select26929.7635853.33
insert27142.5231329.85
update25330.9836281.59

让我们启用uvloop。这就是AsyncTnt的亮点。运行200K时的RPS 300个并行协同路由中的请求(使用uvloop):

Requestaiotarantoolasynctnt
ping38962.01134043.41
call32799.7199866.28
eval27608.0991056.69
select27436.98108940.41
insert33247.57102971.13
update28544.6898643.46

许可证

AsyncTNT是在Apache2.0许可下开发和分发的。

参考文献

  1. Tarantool-内存数据库和 应用服务器。
  2. aiotarantool- 可选的python/asyncio连接器
  3. asynctnt-queue- 的asynctnt上的绑定 tarantool-queue

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java什么类似于安卓中iOS的VOIP推送和呼叫工具包,用于呼叫   java广播接收器第二次不工作   从maven本地导入java   java如何在jdbc中执行oracle过程   java单击按钮时如何更改JButton上的图像?   java Univocity如何将3(n)行解析为一行(bean)   java消除了字符串中出现的所有特定模式   javascript为什么Js不能从我的web服务目录加载图像文件?   pdf如何在没有AdobeAcrobat的情况下在Java中自动创建字段   反思如何以编程方式创建java文件   AmazonWeb服务java。木卫一。IOException:尝试读取aws s3存储桶上的关闭流   java如何在kotlin中映射基于升序的数组列表和排序   java执行一个方法的时间片段出现   不使用'synchronized'关键字的java线程安全代码?   使用Java小程序在浏览器中滚动至顶部   避免“ZLIB输入流意外结束”的java计时要求