python - 对于一对多数据库模型,如何编写 sqlite 查询以避免 python 中的循环?

标签 python python-3.x sqlite

我有两个对象,分别是 RECEIPT 和 PARTICULAR。

RECEIPT 对象的属性是:

  • 收据号

  • 特殊列表

特定对象的属性是:

  • 特定的编号
  • 特别的名字

我也有他们各自的表格。 receiptNo是RECEIPT表的主键,是PARTICULAR表的外键。所以收据有多个细节。

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

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

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

然而,当它为 RECEIPT 返回重复数据时,即对于每个特定行,相应的 RECEIPT 数据也在提取。此 RECEIPT 数据是重复的,因为多个 particularId 共享相同的 receiptNo。因此,我无法将数据正确加载到 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

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

相关文章:

javascript - 如何将 InMemoryUploadedFile 上传到我的 S3 存储桶?

python - Python 中的最小或最大赋值运算符

python - 执行从 python gflags 到 yaml 和返回的转换的惯用方式是什么?

python - 如何禁止在 Python/Tk 程序中选择文本?

python - 在seaborn FacetGrid中的两个线图之间实现

iphone - 核心数据 : Is it possible to use custom function in group by

sql - 将日期格式化为星期几

python - "Literally"将字符串转换为字节数组

python - 使用 Pandas 从复杂的字典/列表中创建 DataFrame

c++ - 提高 SQLite SELECT 性能