东京橱柜桌子的 Cython 包装纸
项目描述
内容
关于
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 编码。
调
参数可以发送到构造函数。
>>> 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
也可以看看
tc nice c-python 绑定所有tokyo cabinet db 类型,包括表
如需帮助,请参阅ctcable.pyx顶部的 TODO 列表
东京内阁数据库 api http://1978th.net/tokyocabinet/spex-en.html#tctdbapi