首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用python从数据库中创建家谱(家谱)?

如何用python从数据库中创建家谱(家谱)?
EN

Stack Overflow用户
提问于 2020-05-17 09:27:00
回答 1查看 407关注 0票数 1

我想创建一个反向的家谱(血统),它从孩子开始,并显示整个线,直到第一对夫妇。我的数据库有上千个条目,并且有一个模式和附带的示例,如下所示:

代码语言:javascript
复制
0 id    |   17444
5 Sire  |   100
6 did   |   203
7 Dam   |   102
11 Name |   Bruce

其中孩子由名字和did表示。条目Dam和Sire也是dids。

我尝试了下面这样的方法:

代码语言:javascript
复制
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])

它打印出一整面墙的文本,例如:

代码语言:javascript
复制
Bruce
Thomas
Martha
Partick
Sara
Kenneth
Catherine

我在想我应该使用某种ADT,但我从大学开始就没有用过它。任何有用的建议都是很棒的!这不是学校的作业,这是我妻子想要的,哈哈。

这个问题与我的问题几乎相同,而且他们的回答也差不多:Pedigree/Family tree chart from database

EN

回答 1

Stack Overflow用户

发布于 2020-05-17 09:44:45

一种选择是使用递归公用表表达式遍历分层结构:

代码语言:javascript
复制
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中迭代并运行多个查询。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61845831

复制
相关文章

相似问题

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