首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表格B-树从lmdb数据库返回

表格B-树从lmdb数据库返回
EN

Stack Overflow用户
提问于 2021-08-24 21:58:30
回答 1查看 135关注 0票数 0

我正在遍历一棵树并形成一个(key:value) lmdb数据库。我正在努力使树返回迭代lmdb。

  1. Can one建议如何通过遍历数据库来形成树,这是( key : value) NoSQL?
  2. lmdb键是按字典排序的。有什么方法可以阻止它,保持秩序,这样可以帮助树形回到

用于创建lmdb数据库的代码:

代码语言:javascript
复制
import lmdb
import pickle

class node:
    def __init__(self, info, level = 0):
        self._info = info
        self.level = level

#               A:1
#             /   \
#          B:2       C:3
#       /            \
#      D:4            G:7
#   /     \
# E:5       F:6
#  "A" : serialized node-A
# "A.B" : serialized node-B
# "A.C" : serialized node-c
# "A.B.D" : serialized node - D
# "A.C.G" : serialized node - G
# "A.B.D.E" : serialized node - E
# "A.B.D.F" : serialized node - F

#Form the lmdb from Tree
env = lmdb.open("test.lmdb")
txn = env.begin(write=True)
new_node = node({"A":1})
txn.put(pickle.dumps("A"), pickle.dumps(new_node))
new_node = node({"B":2}, 1)
txn.put(pickle.dumps("A.B"), pickle.dumps(new_node))
new_node = node({"C":3}, 1)
txn.put(pickle.dumps("A.C"), pickle.dumps(new_node))
new_node = node({"D":4}, 2)
txn.put(pickle.dumps("A.B.D"), pickle.dumps(new_node))
new_node = node({"G":7}, 2)
txn.put(pickle.dumps("A.C.G"), pickle.dumps(new_node))
new_node = node({"E":5}, 3)
txn.put(pickle.dumps("A.B.D.E"), pickle.dumps(new_node))
new_node = node({"F":6}, 3)
txn.put(pickle.dumps("A.B.D.F"), pickle.dumps(new_node))

迭代数据库代码:

代码语言:javascript
复制
env = lmdb.open("test.lmdb")
txn = env.begin()
cursor = txn.cursor()
for idx, value in enumerate(cursor):
    a,b = pickle.loads(value[0]), pickle.loads(value[1])
    print(a,b)
EN

回答 1

Stack Overflow用户

发布于 2021-08-25 19:07:31

我终于想出了如何形成这棵树。

代码语言:javascript
复制
#form Tree from lmdb
cursor = txn.cursor()
root = Node()
for idx, value in enumerate(cursor):
    a,b = pickle.loads(value[0]), pickle.loads(value[1]) # a: string b: obj
    print(a,b)
    tree_node = root #always start with root
    _xl = a.split(".") #list of paths
    if len(_xl) == 1:
        setattr(root,a,b)
    else:
        _il = _xl[:len(_xl) - 1]  # all path except child
        _child_name = _xl[-1]
        #discover parent
        parent = root
        for item in _il:
            parent = getattr(parent,item)
        setattr(parent, _child_name, b)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68914545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档