(动态模式)dict->sqlite3库
DictLiteStore的Python项目详细描述
dictlitestore
用于在可查询文件中存储python dict的动态schema sqlite后端 数据库。
dict中的所有值都存储为json值 在数据库中,但是键被映射到表列中,因此您可以 查询一些东西,尽管它仍然很容易解析。
当您试图添加一个dict,该dict的键不在表中 它将自动添加这些列。
所以一句话:
{'author': 'dan', 'project': 'DictLiteStore', 'categories': ['python', 'dict', 'persistance'] }
在数据库中成为:
AUTHOR | PROJECT | CATEGORIES |
---|---|---|
^{tt1}$ | ^{tt2}$ | ^{tt3}$ |
这很酷,因为您可以使用普通的sql来查询内容。
SELECT * FROM 'dict_store' WHERE 'author' == '"dan"'
例如。(注意查询值周围的引号。) 简单包装sql select函数(get),如果 不想自己运行类型sql。请参阅下面的用法部分。
因为数据是json格式的,即使对于列表(比如类别),您也可以 也可以很容易地查询。在中搜索“python”的所有行 比如说,分类。sqllite全文搜索相当快。 你不能从一对多的关系中得到性能上的好处 查询,但如果您处于性能关键型环境中,则 无论如何,应该是在看一个真正的SQL服务器。
当数据从sqllite返回时,如果使用 dictlitestore模块中的“get”函数,它将重新转换 jsonified值(比如“categories”列表)返回到python中 列表。这很有用。:-)
dictlitestore最初只是在 Marlinespike的缓存系统,但作为一个独立的模块, 对许多数据存储系统都很有用。
用法:
记录数据:
foo = {'title': 'Foo the first', 'dict':'Bar Bar Bar'} with DictLiteStore('data.db', 'table_of_random_stuff') as bucket: bucket.store(foo)
现在字典'foo'作为一行存储在data.db中 您可以直接使用sqllite查询来访问数据, 或者有一个非常简单的select包装器,它可以帮助 资料:
bucket.get(('title','LIKE',NoJSON('%Foo%')))
返回
[{'title':'Foo the first','dict':'Bar Bar Bar'}]
要更新表,还可以使用update()方法:
bucket.update({'title':'updated title'})
将更新all行以获得新标题。我们可以用where子句 就像在Get中限制伤害:
bucket.update({'title': 'updated title'}, True, ('title', '==', 'old title'))
你想知道那随机的“真”是为了什么?
update方法需要知道您是否希望它编写dict(插入它) 如果where子句失败,则返回到表中。如果你只想更新,而不是 如果没有匹配的行,请插入,然后按如下方式运行更新:
bucket.update({'title':'updated title'}, False, ('title','==','old title'))
注:
- 所有数据在写入之前都被序列化为json,然后在退出时被反序列化。 这意味着字符串周围会有额外的引号。可能有更好的办法, 但我不太确定是否最有效。(尝试反序列化,如果不起作用, 留作绳子?误报太多了,我会想……。
- 所有不可jsonal的数据都先进行字符串化,然后进行json'd。
- 目前很少发生错误检查。在生产之前,这需要 边缘有很多支撑物。
- 我需要做一些性能实验!这到底有多管用,速度方面?