Как написать sqlite-запрос, чтобы избежать цикла в python для модели базы данных «один ко многим»? - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть два объекта с именем RECEIPT и PARTICULAR.

Атрибутами объекта RECEIPT являются:

  • receiveNo

  • specificList

Атрибуты объекта PARTICULAR:

  • specificId
  • specificName

Также у меня есть их соответствующие таблицы. receiveNo - это первичный ключ таблицы RECEIPT, а это внешний ключ в таблице PARTICULAR.Таким образом, для получения есть несколько данных.

Я хочу получить данные для заполнения объекта RECEIPT.Чтобы достичь этого, я могу сначала выполнить запрос на выборку к таблице RECEIPT, и, повторяя результат с помощью цикла for, я могу выполнить другой запрос для извлечения таблицы PARTICULAR.Здесь я дважды звоню в БД.

Чтобы не вызывать DB дважды, я попытался объединить также как:

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

Однако, поскольку он возвращает повторяющиеся данные для RECEIPT, то есть для каждой строки PARTICULAR соответствующие данные RECEIPT также разбиваются.Эти данные ПОЛУЧЕНИЯ являются повторяющимися, так как несколько конкретных идентификаторов разделяют одну квитанцию.Из-за этого я не могу правильно загрузить данные в объект RECEIPT (или, может быть, я не знаю, как загрузить такой результат в соответствующие объекты)

Мое действительное требование - загрузить объект RECEIPT, сформировав список PARTICULAR длякаждая квитанция

Является ли использование цикла for и двойной вызов DB единственным способом достижения этого?Предложите мне эффективный способ добиться этого

1 Ответ

0 голосов
/ 29 сентября 2018

Я думаю, что запрос данных из базы данных с помощью подхода JOIN является наиболее эффективным способом сделать это.

Если вы убедитесь, что ORDER BY "RECEIPT_NO", вам просто нужно пройтись по списку один раз вpython, только создает новый объект Receipt каждый раз, когда вы достигаете нового «RECEIPT_NO».

Таким образом, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...