如何在 lmdb 中正确插入重复键?
How to correctly insert duplicate keys in lmdb?
根据文档 (https://lmdb.readthedocs.org/en/release/),将 dupsort
传递给 open_db()
应该允许将重复键添加到 lmdb 数据库。但事实似乎并非如此,它仍在覆盖值,除非我读错了文档。
env = lmdb.open(path.join(directory, 'lmdb'), map_size=map_size)
db = env.open_db(dupsort=True)
with env.begin(db=db, write=True) as transaction:
transaction.put(b'mykey', b'value1')
transaction.put(b'mykey', b'value2')
transaction.put(b'mykey', b'value3')
但是,当我遍历键值时,它只显示最后一个值 "value3"。
cursor = transaction.cursor()
for key, value in cursor.iternext(True, True):
print(key, value)
iternext_dup()
似乎也没有打印出预期值。我也试过 cursor.next()
,它只 return True
一次,另外 transaction.stat()
显示 entries: 1
.
结帐iternext_dup(keys=False, values=True) 方法
根据文档,
Return 一个前向迭代器,在调用 next_dup() 之前产生当前键的当前值(“重复”),重复直到达到当前键的最后一个值。
仅对使用 dupsort=True 打开的数据库有意义。
我发现出了什么问题。文档不是很清楚,似乎 dupsort 不适用于默认数据库,您需要通过 open_db()
.
创建一个新数据库
默认数据库的标志状态都是false,没有办法改变标志的持久状态,所以没有办法对默认数据库进行dupsort。
例如
env = lmdb.open(path, max_dbs=2)
# doing just env.open_db(dupsort=True) doesn't work
db = env.open_db('db2', dupsort=True)
...
根据文档 (https://lmdb.readthedocs.org/en/release/),将 dupsort
传递给 open_db()
应该允许将重复键添加到 lmdb 数据库。但事实似乎并非如此,它仍在覆盖值,除非我读错了文档。
env = lmdb.open(path.join(directory, 'lmdb'), map_size=map_size)
db = env.open_db(dupsort=True)
with env.begin(db=db, write=True) as transaction:
transaction.put(b'mykey', b'value1')
transaction.put(b'mykey', b'value2')
transaction.put(b'mykey', b'value3')
但是,当我遍历键值时,它只显示最后一个值 "value3"。
cursor = transaction.cursor()
for key, value in cursor.iternext(True, True):
print(key, value)
iternext_dup()
似乎也没有打印出预期值。我也试过 cursor.next()
,它只 return True
一次,另外 transaction.stat()
显示 entries: 1
.
结帐iternext_dup(keys=False, values=True) 方法
根据文档,
Return 一个前向迭代器,在调用 next_dup() 之前产生当前键的当前值(“重复”),重复直到达到当前键的最后一个值。
仅对使用 dupsort=True 打开的数据库有意义。
我发现出了什么问题。文档不是很清楚,似乎 dupsort 不适用于默认数据库,您需要通过 open_db()
.
默认数据库的标志状态都是false,没有办法改变标志的持久状态,所以没有办法对默认数据库进行dupsort。
例如
env = lmdb.open(path, max_dbs=2)
# doing just env.open_db(dupsort=True) doesn't work
db = env.open_db('db2', dupsort=True)
...