Как сделать так, чтобы в базу данных добавлялись не строки, а увеличивался столбец количество питон?
Пишу кассу, нужно, чтобы при нажатии на кнопку с названием продукта, он добавлялся в таблицу базы данных, но если я нажму на него повторно, то, чтобы просто увеличилось количество, а новая строчка не добавлялась. При это ограничение на саму базу данных я не могу наложить, потому что в следующем заказе, который тоже находится в этой базе данных, данный товар должен печататься снова. Вот пример моего кода
def add_possition(self, button):
for i in range(len(self.buttons)):
l=0
if i == 0 and i == button:
MainApp.curs.execute(f'insert into Карта_заказа (Название_блюда, Цена_блюда, Код_блюда) select Название, Цена, Код_блюда from Меню WHERE Код_раздела = 1 and Код_блюда = {i + 1}')
MainApp.curs.execute(f'''UPDATE Карта_заказа SET Количество = {l+1} WHERE Код_блюда = {i + 1}''')
l+=1
Ответы (2 шт):
Не могу предложить вариант решения в контексте вашего класса, предлагаю в общем виде.
import sqlite3
myconnect = sqlite3.connect('database.db')
cur = myconnect.cursor()
code_b = 1 # Здесь код блюда, наверно от кнопки?
record_exists = cur.execute(
'''SELECT Название_блюда, Цена_блюда, Код_блюда, Количество FROM Карта_заказа WHERE Код_блюда = ?''',
(code_b,)).fetchone()
if record_exists:
cur.execute('''UPDATE Карта_заказа SET Количество = ? WHERE Код_блюда = ?''', (record_exists[3] + 1, code_b))
else:
cur.execute('''INSERT INTO Карта_заказа(Название_блюда, Цена_блюда, Код_блюда)
SELECT Название, Цена, Код_блюда
FROM Меню
WHERE Код_раздела = 1 and Код_блюда = ?''', (code_b,))
myconnect.commit()
myconnect.close()
Это вариант будет работать, если ввод будет "по одному", в цикле будут тормоза.
Лучше не заниматься изменением строк на кассовом аппарате. В этом месте понадобятся слишком много проверок чтоб исключить двойное редактирование заказа.
Предлагаю вариант делать всегда INSERT. А на экран пользователю выводить что-то вроде
SELECT *, SUM(Количество) FROM Заказы WHERE Код_заказа=$1 GROUP BY Код_блюда;