Можно ли ОБНОВИТЬ строки с разными данными, когда они имеют одинаковый идентификатор и разные PKEY? - PullRequest
0 голосов
/ 15 апреля 2020

У меня проблема с обновлением строк в моей базе данных SQL. Я пытаюсь создать простую программу в PyQT5, где я могу хранить рецепты еды, ингредиенты и тому подобное. Я использую sqlite3 в качестве соединителя.

Я пытаюсь получить данные из списков [ингредиент] и [количество] и сохранить их в базе данных.

Например: пользователь набрал food_name Фруктовый салат, он выбрал яблоко и количество 2. Он добавил его к столу, а также выбрал банан и набрал количество 5. А теперь я хочу хранить эту еду в столах и не знаю, как мне это сделать. Я застрял в момент, когда мне нужно заполнить столбцы ингридиенты_интергента и ингредиента_квартиры в таблице Количество.

Моя база данных выглядит так:

Рецепт:

|Recipe|

|recipe_id[PK]| |recipe_name| |prep_time|

     1           fruit salad     00:20

Количество:

|Quantity|

|quantity_id[PK]| |recipe_id| |ingredient_id| |ingredient_quantity|
        1              1             
        2              1

Ингредиенты:

|Ingredients|

|ingredient_id| |ingredient_name|
      1               apple
      2               banana

Мои переменные, которые я получаю из пользовательского ввода: recipe_name, description, Время подготовки

QTableWidget с ингредиентами и количеством -> У меня есть чтобы выяснить, как их соединить, я собирался создать кортеж и использовать функцию zip.

enter image description here

Я пытался:

SQL = "INSERT INTO Recipe (recipe_name, prep_time, recipe_description) 
VALUES (:recipe_name, :prep_time, :recipe_description)",
       {'recipe_name':recipe_name, 'prep_time':prep_time, 'recipe_description':recipe_description})

Я использовал это утверждение для создания записи в базе данных на основе ввода, предоставленного пользователем, и я создал новую переменную, которая является lastrowid, в этом случае это будет мой recipe_id Тогда:

 for item in ingredient_list:
       conn.cur.execute("INSERT INTO Quantity (recipe_id) 
                          VALUES ((SELECT recipe_id from Recipe WHERE recipe_name=:recipe_name))",
                        {'recipe_name':recipe_name})

Таким образом, я создал новые записи с тем же recipe_id

И последнее, что у меня вызывает проблемы:

conn.cur.executemany("UPDATE Quantity SET ingredient_id = (SELECT ingredient_id FROM Ingredients WHERE ingredient_name = ?), ingredient_quantity = ?) 
WHERE recipe_id=? AND ingredient_id IS Null ",
    ((val, quan, lastrowid) for val in ingredient_list for quan in quantity_list))

Я думал, что если я добавлю ингредиент_ид IS НУЛЬ это перестанет перезаписывать мои данные, но это не работает Я также знаю, что в конце у меня есть вложенное l oop, но когда я попытался заполнить только имя_ ингредиента, оно тоже не сработало.

...