python - 如何在 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()
了,它只返回True
一次,另外transaction.stat()
显示entries: 1
.
解决方案
签出 iternext_dup(keys=False, values=True) 方法
从文档中,
返回一个前向迭代器,它在调用 next_dup() 之前产生当前键的当前值(“重复”),重复直到达到当前键的最后一个值。
仅对使用 dupsort=True 打开的数据库有意义。
推荐阅读
- google-cloud-platform - 如何在 Google Cloud 中获取 IAM 中所有成员的列表
- postgresql - 在 postgresql 中为 CROSSTAB 生成动态列?
- powerbi - Power BI 中使用动态访问令牌(密钥)进行 REST API 调用(如 HTTP GET)以读取数据的任何更好方法
- c# - C# 和 VB.NET 中不同的文件字节数组
- c# - 有没有办法为 NLog syslog SyslogTarget 消息设置编码
- laravel - 从关系中检索独特的结果
- c - 可以在不终止当前进程中的会话的情况下将实时 TCP 连接传递给不同的进程吗?
- php - 基于referrer的重定向发送ERR_TOO_MANY_REDIRECTS
- python - 计算分组数据框列中的项目对数。(熊猫)
- flutter - 使用 Flutter 进行高效的图像处理?