python - 如何编写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 是实现它的唯一方法吗?建议我一种有效的方法来实现这一目标
解决方案
我认为使用 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
推荐阅读
- typescript - 难以理解 Typescript 的分布式逻辑
- python - 在 tensorfow 中,如何从 CNN 等小型网络为 neurl 网络设置特定参数?
- javascript - 无法从javascript中的输入字段获取输入
- node.js - 将图像文件从角度传递给nodejs
- android - Android - 为 Gradle 依赖项指定产品风格和构建类型
- python - 多个符号的 Django 密码验证器
- ios - 如何将启动画面添加到 Flutter webview 应用程序?
- swiftui - 刷新 SwiftUI 父视图是否会导致子视图刷新?
- swift - “getPendingNotificationRequests”总是快速返回 0
- javascript - 使用 D3.js 创建一个简单的树形图