我有两个对象,称为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/