如何编写sqlite查询以避免python中一对多数据库模型的循环?

如何编写sqlite查询以避免python中一对多数据库模型的循环?,python,python-3.x,sqlite,Python,Python 3.x,Sqlite,我有两个对象称为收据和特殊 收货对象的属性有: 收据号码 特殊主义者 特定对象的属性包括: 特殊的 特殊名称 我还有他们各自的桌子receiptNo是接收表的主键,也是特定表的外键。因此,收据有多个细节 我想获取数据以填充收据对象。为了实现这一点,我可以首先运行selectquerytoreceivetable,通过使用for循环迭代结果,我可以运行另一个查询来获取特定的表。我给DB打了两次电话 为了避免两次调用DB,我还尝试了以下方法: SELECT * FROM RECEIPT r,

我有两个对象称为收据和特殊

收货对象的属性有:

  • 收据号码

  • 特殊主义者

特定对象的属性包括:

  • 特殊的
  • 特殊名称
我还有他们各自的桌子receiptNo是接收表的主键,也是特定表的外键。因此,收据有多个细节

我想获取数据以填充收据对象。为了实现这一点,我可以首先运行selectquerytoreceivetable,通过使用for循环迭代结果,我可以运行另一个查询来获取特定的表。我给DB打了两次电话

为了避免两次调用DB,我还尝试了以下方法:

SELECT * FROM RECEIPT r,PARTICULAR p WHERE r.RECEIPT_NO = p.RECEIPT_NO
但是,当它返回收据的重复数据时,即对于每个特定行,相应的收据数据也被删除。此收货数据是重复的,因为多个特定数据共享同一收货编号。因此,我无法将数据正确加载到收据对象(或者可能是我不知道如何将此类结果集加载到相应的对象)

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

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

我认为使用连接方法从数据库查询数据是最有效的方法

如果您确保按“RECEIPT\u NO”排序,您只需在python中循环一次列表,每次到达新的“RECEIPT\u 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

“从两个表中提取数据并分配给接收对象”是什么?你需要准确地解释你想要什么样的输出,以及为什么你尝试的东西不起作用;你得到的与你想要的有什么不同?@DanielRoseman我已经更新了这个问题。我的要求是通过从DB获取数据来填充Receipt对象。但是我想知道一种有效的方法,为什么要尝试将数据从相关表(即子信息)附加到父表中?这会复制不必要的数据。关系模型(作为关系数据库(如SQLite)的基础)的重点之一是避免数据存储的冗余。@Parfait您能分享一下您的方法吗?对我来说,子对象列表是父对象的字段之一。如果您有更好的数据库模型,请共享谢谢@jpeg。这似乎是一对多关系数据库模型的常见情况。我在Java世界中也发现了类似的问题。在这里,他们使用Map来处理java端的重复数据。在我们的例子中,我们可以使用字典来保存您的最后一张收据。不管怎样,您的答案是简洁明了的。