【问题标题】:How to write sqlite query to avoid loop in python for one-to-many database model?如何为一对多的数据库模型编写sqlite查询以避免python中的循环?
【发布时间】:2018-09-30 13:03:26
【问题描述】:

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

RECEIPT 对象的属性是:

  • receiptNo

  • 特定列表

特定对象的属性是:

  • 特定 ID
  • 特定名称

我也有他们各自的表格。 receiptNo 是 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 是实现它的唯一方法吗? 建议我一种有效的方法来实现这一目标

【问题讨论】:

  • 什么是“从两个表中获取数据并分配给 RECEIPT 对象”?你需要准确地解释你想要什么输出,以及为什么你尝试的东西不起作用;你得到的和你想要的有什么不同?
  • @DanielRoseman 我已经更新了这个问题。我的要求只是通过从数据库中获取数据来填充 Receipt 对象。但我想知道有效的方法
  • 您为什么要尝试将相关表中的数据(即,子信息添加到父表中)?这会复制不必要的数据。关系模型(SQLite 等关系数据库的基础)的重点之一是避免数据存储的冗余。
  • @Parfait 你能分享你的方法吗?对我来说,子对象列表是父对象的字段之一。如果您有更好的数据库模型,请分享

标签: python python-3.x sqlite


【解决方案1】:

我认为使用 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

【讨论】:

  • 谢谢@jpeg。似乎这是一对多关系数据库模型的常见情况。我也在 Java 世界stackoverflow.com/questions/13295600/… 中发现了类似的问题。在这里,他们使用 Map 来处理 java 端的重复数据。在我们的例子中,我们可以使用 Dictionary 来保存您的 last_receipt_nr。无论如何,你的答案是干净和简单的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多