如何从数据库中使用python创建族谱?

2024-05-06 13:17:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个反向的家谱(谱系),从孩子开始,显示直到第一对夫妇的整个序列。 我的数据库有1000个条目,并有一个模式和如下示例:

0 id    |   17444
5 Sire  |   100
6 did   |   203
7 Dam   |   102
11 Name |   Bruce

其中子项由名称和did表示。大坝和父系的入口也是DID

我尝试了以下方法:

def pedigree(did):
    con = sqlite3.connect('subjects.db')
    cursor = con.execute('SELECT * FROM animals where did IS "%s" ' % did)
    for row in cursor:
        print(row[11])
        pedigree(row[5])
        pedigree(row[7])

它打印出一堵文字墙,例如:

Bruce
Thomas
Martha
Partick
Sara
Kenneth
Catherine

我想我应该使用某种ADT,但我从大学起就没有弄乱过。 任何有用的建议都会很好! 这不是学校的作业,这是我妻子想要的,哈哈

这个问题和我自己的问题几乎一样,而且他们已经做到了:Pedigree/Family tree chart from database


Tags: 数据库示例模式孩子条目序列concursor
1条回答
网友
1楼 · 发布于 2024-05-06 13:17:54

一个选项是使用递归公共表表达式遍历层次结构:

with recursive cte as (
    select name, sire, dam, 0 lvl from animals where did = ?
    union all
    select a.name, a.sire, a.dam, c.lvl + 1
    from cte c
    inner join animals a on a.did in (c.sire, c.dam)
)
select * from cte order by lvl

递归查询的锚点通过did选择初始行;然后,递归部分沿着关系向上,选择对应于上一次迭代的siredam的记录,直到树耗尽为止。作为奖励,我添加了一个名为lvl的列,它表示树中每个节点的深度

基本上,这模仿了您在应用程序代码中实现的算法-但是这应该更有效,因为整个工作在数据库中一次执行,而不是在python中迭代和运行多个查询

相关问题 更多 >