如何在 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)
...