nosql - 从 lmdb 数据库返回 Form B-Tree
问题描述
我正在遍历一棵树并形成一个(key:value)
lmdb 数据库。我正在努力形成树回迭代lmdb。
- 有人可以建议如何通过迭代(键:值)NoSQL的数据库来形成树吗?
- lmdb 键按字典顺序排序。有没有办法阻止它并保持可能有助于形成树的顺序
形成 lmdb 数据库的代码:
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))
迭代数据库代码:
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)
解决方案
我终于弄清楚如何形成树了。
#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)
推荐阅读
- spring - POST 请求未从过滤器转发到控制器类
- .htaccess - 将所有外部请求重定向到与服务器 url .htaccess 等效的 prod
- asynchronous - Asio的执行流程是什么?
- c - FILE vs HANDLE - 这两件事有什么区别
- python - Docker Flask - jinja2.exceptions.TemplateNotFound 错误
- python-3.x - Python3 - YAML 未正确在列表中附加值
- javascript - Why is the for loop ending very early?
- rxjs - 延迟无限流的每个值
- docker - 在 Alpine Docker 上安装 Scipy 时准备轮元数据时出错
- sql-server - SQL Server 中的表没有自然键