我有两个对象,称为RECEIPT和PARTICULAR。

RECEIPT对象的属性是:


收据编号
特别列表


PARTICULAR对象的属性为:


specialId
特别名称


我也有他们各自的表。 receiveNoNo是RECEIPT表的主键,它是PARTICULAR表中的外键。因此,对于收据,有很多细节。

我想获取数据以填充RECEIPT对象。为此,我可以先对RECEIPT表运行选择查询,并使用for循环对结果进行迭代,然后我可以运行另一个查询以获取PARTICULAR表。在这里,我两次致电数据库。

为了避免两次调用DB,我还尝试了join:

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


但是,当它返回针对RECEIPT的重复数据时,即对于每个特殊行,相应的RECEIPT数据也将生效。此RECEIPT数据是重复的,因为多个specificId共享相同的receiveNo。由于这个原因,我无法将数据正确加载到RECEIPT对象(或者我可能不知道如何将这样的重新加载到相应的对象)

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

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

最佳答案

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

如果您确定要按“ RECEIPT_NO”进行ORDER BY,则只需在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

关于python - 如何编写sqlite查询以避免python中的一对多数据库模型循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52571043/

10-10 18:07