对于小型项目,SQLite(或类似的)中是否有内置的方法来保持 SQL/NoSQL 两全其美,即:
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
Run Code Online (Sandbox Code Playgroud)
注意:多年来,我一直惊讶于 SQLite 实际上可以在几行代码中实现多少有趣的功能,这就是为什么我问我这里描述的内容是否可以通过 SQLite 仅使用一些 SQLite 核心功能。
PS:可能看起来像一个解决方案,但实际上它只是一个持久的键/值存储,并且它不具有查询/功能; 此外(BerkeleyDB for Python)看起来已被弃用,并且没有类似 API 的查询功能。shelve findbsddb
解决方法有很多连载小词典:json.loads/ json.dumps,pickle,shelve,ujson,甚至使用sqlite.
但是当处理可能100 GB的数据时,再也不可能使用在关闭/序列化时可能重写整个数据的模块.
redis 实际上不是一个选项,因为它使用客户端/服务器方案.
问题:哪些密钥:值存储,无服务器,能够使用100多GB数据,在Python中经常使用?
我正在寻找具有标准"Pythonic" d[key] = value语法的解决方案:
import mydb
d = mydb.mydb('myfile.db')
d['hello'] = 17 # able to use string or int or float as key
d[183] = [12, 14, 24] # able to store lists as values (will probably internally jsonify it?)
d.flush() # easy to flush on disk
Run Code Online (Sandbox Code Playgroud)
注意:BsdDB(BerkeleyDB)似乎已被弃用.似乎有一个用于Python的LevelDB,但它似乎并不为人所知 - 我还没有找到一个可以在Windows上使用的版本.哪些是最常见的?