在SQLite(或类似)中,是否有一种内置的方法可以为小型项目保留SQL / NoSQL的双重优势,即:
- 像SQLite一样存储在一个(平面)文件中(没有客户端/服务器方案,无需安装服务器;更确切地说:除了
pip install <package>
之外不需要安装其他内容) - 可以将行存储为
dict
,而无需为每个行定义一个公共结构,就像NoSQL数据库一样 - 支持简单查询
示例:
db = NoSQLite('test.db')
db.addrow({'name': 'john doe', 'balance': 1000, 'data': [1, 73.23, 18]})
db.addrow({'name': 'alice', 'balance': 2000, 'email': 'a@b.com'})
for row in db.find('balance > 1500'):
print(row)
# {'id': 'f565a9fd3a', 'name': 'alice', 'balance': 2000, 'email': 'a@b.com'} # id was auto-generated
注意:多年来,SQLite 令我不断惊叹于它能以极简的代码实现许多有趣的功能,这就是为什么我问是否可以仅使用少量 SQLite 核心特性就实现我在此描述的内容。
附注:shelve
或许看起来像是一个解决方案,但它实际上只是一个持久化的键值存储,没有查询/find
函数;而且bsddb
(Python 的 BerkeleyDB)似乎已经过时,并且没有类似 API 的查询功能。