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