Skip to main content

东京橱柜桌子的 Cython 包装纸

项目描述

<nav class="contents" id="contents" role="doc-toc">

内容

</nav>

关于

Pythonic 访问tokyo cabinet表数据库 api。(注意:原始的cython代码来自pykesto。)目的是提供一种简单的语法来加载和查询表中的数据。大部分工作由Col查询接口处理。例如

>>> from totable import ToTable, Col
>>> tbl = ToTable('t.tct', 'w')
>>> result = tbl.select(Col('age') > 18, Col('name').startswith('T'))

允许透明地查询带有数字和字母的列。即使东京内阁将所有值存储为字符串。下面还有更多的合成糖。

安装

首先,安装 Tokyo-Cabinet source,然后,从包含此文件的目录中安装:

# requires cython for now.
$ cython src/ctotable.pyx
$ python setup.py build_ext -i

# test
$ PYTHONPATH=. python totable/tests/test_totable.py

# install
$ sudo python setup.py install

示例使用

制作一些假数据。请注意,它就像 DBM 或字典一样工作,只是值本身是字典。

>>> from totable import ToTable, Col
>>> tbl = ToTable('doctest.tct', 'w')
>>> fnames = ['fred', 'jane', 'john', 'mark', 'bill', 'ted', 'ann']
>>> lnames = ['smith', 'cox', 'kit', 'ttt', 'zzz', 'ark', 'ddk']
>>> for i in range(len(fnames)):
...     tbl[str(i)] = {'fname': fnames[i], 'lname': lnames[i],
...                    'age': str((10 + i) * 2)}
...     tbl[str(i + len(fnames))] = {'fname': fnames[i],
...                                  'lname': lnames[len(lnames) - i - 1],
...                                   'age': str((30 + i) * 2)}

>>> len(tbl)
14

科尔

Col,发送到 select 方法可以很容易地对数据库进行查询,格式为 Col(colname) == 'Fred' 其中 colname 是数据库中字典项中的键之一。或者可以使用 kwargs 来选择()

>>> tbl.select(lname='cox')
[('1', {'lname': 'cox', 'age': '22', 'fname': 'jane'}), ('12', {'lname': 'cox', 'age': '70', 'fname': 'ted'})]

虽然使用 Col 提供了更多的力量

以。。开始

>>> results = tbl.select(Col('fname').startswith('j'))
>>> [d['fname'] + ' ' + d['lname'] for k, d in results]
['jane cox', 'jane ark', 'john kit', 'john zzz']

以。。结束

#and combine queries by sending them in together.
>>> results = tbl.select(Col('fname').startswith('j'), Col('lname').endswith('k'))
>>> [d['fname'] + ' ' + d['lname'] for k, d in results]
['jane ark']

喜欢

这就像一个两端都带有“%”的 sql 查询。(不要将这些值附加到查询中!)。所以让每个人的名字都带有和'e'......

>>> r = tbl.select(Col('fname').like('e'))
>>> sorted(set([v['fname'] for k, v in r]))
['fred', 'jane', 'ted']

in_list

返回与列表中的值1完全匹配的行。

>>> r = tbl.select(Col('fname').in_list(['ted', 'fred']))
>>> sorted(set([v['fname'] for k, v in r]))
['fred', 'ted']

>>> r = tbl.select(Col('age').in_list([20, 70]))
>>> sorted(set([v['age'] for k, v in r]))
['20', '70']

之间

用于最小值和最大值之间的数字查询。包括端点。

>>> r = tbl.select(Col('age').between(68, 70))
>>> [v['age'] for k, v in r]
['68', '70']

数字查询 (richcmp)

在 TC 中,所有内容都存储为字符串,但您可以通过使用(您猜对了)数字来强制与 ToTable 进行基于数字的比较。或者使用字符串进行非数字比较。

>>> results = tbl.select(Col('age') > 68)
>>> [d['age'] for k, d in results]
['70', '72']

组合查询

只需将多个 Col() 参数添加到 select() 调用中,它们本质上就会'ed 在一起。

>>> results = tbl.select(Col('age') > 68, Col('age') < 72)
>>> [d['age'] for k, d in results]
['70']

否定(~)

例如获取所有不是给定值的东西……

>>> results = tbl.select(~Col('age') <= 68)
>>> [d['age'] for k, d in results]
['70', '72']

#all rows where fname is not 'jane'
>>> results = tbl.select(~Col('fname') != 'jane')
>>> 'jane' in [d['fname'] for k, d in results]
False

正则表达式匹配

支持正常的正则表达式字符“[ $ ^ | “ , ETC。

>>> results = tbl.select(Col('fname').matches("a"))
>>> sorted(set([d['fname'] for k, d in results]))
['ann', 'jane', 'mark']

>>> results = tbl.select(Col('fname').matches("^a"))
>>> sorted(set([d['fname'] for k, d in results]))
['ann']

偏移/限制

就像 SQL,哟。

>>> results = tbl.select(Col('age') < 68, limit=1)
>>> len(results)
1

命令

目前仅适用于字符串键。使用“-”表示降序,“+”表示升序

>>> [v['fname'] for k, v in tbl.select(lname='cox', order='-fname')]
['ted', 'jane']

# ascending
>>> [v['fname'] for k, v in tbl.select(lname='cox', order='+fname')]
['jane', 'ted']

价值观

TC 是键值存储,但它也充当表。仅从数据库表中获取您期望的值可能很方便。请注意,在上面的所有示例中,没有使用 'key',仅使用值字典。这可以通过“values_only”变得更简单。当 'values_only' 为 True 时,一些 python 调用开销也会被移除。

::
>>> tbl.select(Col('fname').matches("^a"), values_only=True)
[{'lname': 'ddk', 'age': '32', 'fname': 'ann'}, {'lname': 'smith', 'age': '72', 'fname': 'ann'}]

无模式

因为它是无模式的,你可以添加任何东西

>>> tbl['weird'] = {"val": "hello"}
>>> tbl['weird']
{'val': 'hello'}

删除

按字典界面的预期删除。

>>> del tbl['weird']
>>> print tbl.get('weird')
None

用一个模式 kwarg 封装 put、putkeep 和 putcat,分别采用 'p' 或 'k' 或 'c'。

>>> tbl.put('a', {'a': '1'}, mode='p')
>>> tbl.put('a', {'a': '2'}, mode='k')
'keep'
>>> assert tbl['a'] == {'a': '1'}

>>> tbl.put('b', {'a': '3'}, mode='k')
'put'

>>> tbl.put('a', {'b': '99'}, 'c')
>>> assert tbl['a'] == {'a': '1', 'b': '99'}

性能调优

Tokyo Cabinet 允许您调整优化表格。可用的参数是:

  • bnum指定桶数组的元素个数。'bnum' 的建议大小约为要存储的所有记录数的 0.5 到 4 倍。默认约为 132K。

  • apow以 2 的幂指定记录对齐的大小。默认值为 4,表示 2^4=16。

  • fpow以 2 的幂指定空闲块池的最大元素数。默认值为 10,代表 2^10=1024。

  • opts通过按位或 (|) 指定选项:

    • 必须指定“TDBTLARGE”以使用大于 2GB 的数据库。(您还必须在编译 TC 库时指定一个配置标志以启用此功能)

    • 'TDBTDEFLATE' 使用 Deflate 编码。

    • 'TDBTBZIP' 使用 BZIP2 编码。

    • 'TDBTTCBS' 使用 TCBS 编码。

其他参数:cachemmap_size解释如下。

参数可以发送到构造函数。

>>> import totable
>>> t = ToTable("some.tct", 'w', bnum=1234, fpow=6, \
...                    opts=totable.TDBTLARGE | totable.TDBTBZIP)

>>> t.close()

优化

在以 mode='w' 打开的数据库上调用优化。如果没有指定参数,它将根据表中元素的数量自动调整“bnum”(仅)。

>>> t = ToTable("some.tct", 'w')

# ... add some records ...
>>> t.optimize()
True

mmap_size

mmap_size是映射内存的大小。默认为在构造函数中设置的 67,108,864 (64MB)。这是TC 用语中的xmsiz

>>> t.close()
>>> t = ToTable("some.tct", 'w', mmap_size=128 * 1e6) # ~128MB.

缓存

TC 还允许设置各种缓存参数。* rcnum是要缓存的最大记录数。默认为 0 * lcnum是要缓存的叶节点的最大数量。默认为 4096 * ncnum是缓存的非叶节点的最大数量。默认为 512 这些也必须在构造函数中设置。

>>> t.close()
>>> t = ToTable("some.tct", 'w', rcnum=1e7, lcnum=32768)

指数

在列上创建或删除 's'tring 或 'd'ecimal 索引以加快查询速度。

# create a decimal index on the number column 'age'.
>>> tbl.create_index('age', 'd')
True

# create a 'string index on the string column 'fname'.
>>> tbl.create_index('fname', 's')
True

# remove the index.
>>> tbl.delete_index('fname')
True

# optimize the index
>>> tbl.optimize_index('age')
True

清除

从数据库中删除所有记录。

>>> len(tbl)
16
>>> tbl.clear()
>>> len(tbl)
0

交易

在事务中做事。对任何异常都执行回滚()。

>>> try:
...     with transaction(tbl):
...         tbl['zzz'] = {'a': '4'}
...         1/0
... except: pass

>>> 'zzz' in tbl
False

也可以看看

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

totable-0.1.tar.gz (59.1 kB 查看哈希)

已上传 source