У меня проблема с обновлением строк в моей базе данных 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](https://i.stack.imgur.com/qigaN.png)
Я пытался:
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, но когда я попытался заполнить только имя_ ингредиента, оно тоже не сработало.