gpt4 book ai didi

python - SQLAlchemy 和 MySQL 的多重链表

转载 作者:行者123 更新时间:2023-11-30 23:33:06 30 4
gpt4 key购买 nike

我想在 SQL 表中有多个链表,使用 MySQL 和 SQLAlchemy (0.7)。所有列表的第一个节点的父节点为 0,并以子节点为 0 结束。id 表示列表,而不是独立元素。元素由PK标识

省略了一些语法(与问题无关)它应该看起来像这样:

id(INT, PK)
content (TEXT)
parent(INT, FK(id), PK)
child(INT, FK(id), PK)

由于该表有多个链表,如何从数据库返回整个列表我选择一个特定的 ID 并且父级为 0?

例如:

SELECT * FROM ... WHERE id = 3 AND parent = 0   

最佳答案

鉴于您在同一个表中存储了多个链表,我假设您将它们的 HEAD 和/或 TAIL 存储在其他一些表中。一些想法:

1) 保留链表:从数据查询的角度来看,第一个重大改进(也在评论中提出)是为同一列表中的所有节点提供一些公共(public)标识符(我们称之为 ListID)。这里有几个选项:

  • 如果每个列表仅从一个 对象(数据行)引用[我什至会将问题表述为“列表属于 是否属于单个对象?”],那么这个 ListID 可以只是 holder 对象的(主要)标识符,顶部有 ForeignKey 以确保数据完整性。在这种情况下,查询所有列表非常简单。事实上,您可以定义 relationship 并像 my_object.my_list_items 一样对其进行导航。
  • 如果列表被多个对象使用/引用,则可以创建另一个表,该表将仅包含一列 ListID (PK),并且每个节点/项目将再次具有一个外键它,或类似的东西
  • 否则,可以在两个查询/SQL 语句中加载大型列表:
    1. 通过ID查询HEAD/TAIL
    2. 根据接收到的HEAD/TAIL的ListID查询整个列表
      事实上,这可以通过一个查询完成,如下面的查询(单查询示例),从 IO 的角度来看效率更高,但分两步完成的好处是您可以立即获得对 HEAD(或 TAIL)节点的引用。

单查询示例:

# single-query using join (not tested)
Head = alias(Node)
qry = session.query(Node).join(Head, Node.ListID == Head.ListID).filter(Head.ID == head_node_id)

无论如何,为了遍历链表,您必须通过其 ID 获取 HEAD/TAIL,然后照常遍历。
注意:这里我不确定 SA 是否会识别引用对象已经加载到 session 中,或者会为每个这些对象发出其他 SQL 语句,这将破坏批量加载的目的。


2) 用 Ordering List 扩展替换链表:
请阅读Ordering List文档。很可能 Ordering List 实现足以让您代替链表使用

关于python - SQLAlchemy 和 MySQL 的多重链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9599825/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com