首页 > 解决方案 > 如何编写sqlite查询以避免python中的一对多数据库模型循环?

问题描述

我有两个名为 RECEIPT 和 PARTICULAR 的对象。

RECEIPT 对象的属性是:

特定对象的属性是:

我也有他们各自的桌子。receiveNo是 RECEIPT 表的主键,它是 PARTICULAR 表的外键。因此,对于收据,有多个细节。

我想获取数据以填充 RECEIPT 对象。为了实现这一点,我可以首先对 RECEIPT 表运行选择查询,然后通过使用 for 循环迭代结果,我可以运行另一个查询来获取 PARTICULAR 表。在这里,我两次调用数据库。

为了避免调用 DB 两次,我也尝试加入:

SELECT * FROM RECEIPT r,PARTICULAR p WHERE r.RECEIPT_NO = p.RECEIPT_NO

然而,当它返回 RECEIPT 的重复数据时,即对于每个特定的行,相应的 RECEIPT 数据也会被匹配。这个 RECEIPT 数据是重复的,因为多个 specificId 共享相同的receiptNo。因此,我无法将数据正确加载到 RECEIPT 对象(或者我可能不知道如何将此类结果集加载到相应的对象)

我的实际要求是通过为每个收据形成特定列表来加载 RECEIPT 对象。

使用 for 循环和两次调用 DB 是实现它的唯一方法吗?建议我一种有效的方法来实现这一目标

标签: pythonpython-3.xsqlite

解决方案


我认为使用 JOIN 方法从数据库中查询数据是最有效的方法。

如果您确保按“RECEIPT_NO”排序,则只需在 python 中遍历列表一次,每次到达新的“RECEIPT_NO”时只创建一个新的 Receipt 对象。

所以SQL变成了:

SELECT * FROM RECEIPT r,PARTICULAR p WHERE r.RECEIPT_NO = p.RECEIPT_NO ORDER BY RECEIPT_NO

python代码可能看起来像

data = query("SELECT * FROM RECEIPT r,PARTICULAR p WHERE r.RECEIPT_NO = p.RECEIPT_NO ORDER BY RECEIPT_NO")

last_receipt_nr = ""
for row in data:
    if last_receipt_nr == row.RECEIPT_NO:
        # Replace with code initializing a new Receipt object
        last_receipt_nr = row.RECEIPT_NO
    #Replace with code initializing a new Particular object

推荐阅读