Как обновить уровень запаса после «заказа»? - PullRequest
0 голосов
/ 27 декабря 2018

Я практикую использование баз данных в Python с sqlite3.Я создаю систему управления запасами для магазина, и у меня есть таблица продуктов с полями: ProductID, Name, StockLevel.

Я пытаюсь обновить уровень запаса при совершении покупки.Таким образом, уровень запаса для определенного продукта должен быть вычтен из заказанного числа.

Мой код:

def update_stock(product,no_bought):
    with sqlite3.connect("shop.db") as db:
        cursor = db.cursor()
        sql = "UPDATE Product SET StockLevel = StockLevel - %s WHERE Name = %s" 
        cursor.execute(sql, (no_bought, product))
        db.commit()

product = input("What product has been bought: ")
no_bought = input("How much has been bought: ")
update_stock(product,no_bought)

sqlite3.OperationalError: вблизи "%": синтаксическая ошибка

Почему он дает эту ошибку?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Используйте ? в качестве заполнителя на основе документации для sqlite3 .

def update_stock(product, no_bought):
    with sqlite3.connect("shop.db") as db:
        cursor = db.cursor()
        sql = "UPDATE Product SET StockLevel = StockLevel - ? WHERE Name = ?"
        cursor.execute(sql, (no_bought, product))
        db.commit()
product = input("What product has been bought: ")
no_bought = input("How much has been bought: ")
update_stock(product,no_bought)
0 голосов
/ 27 декабря 2018

Вам необходимо использовать два заполнителя для обеих переменных и правильно параметризировать запрос (остерегайтесь SQL-инъекций !):

sql = """
    UPDATE  
        Product 
    SET 
        StockLevel = StockLevel - ?
    WHERE 
        Name = ?
"""
cursor.execute(sql, (no_bought, product))

Обратите внимание, какпараметры запроса передаются в execute() отдельно, и как у нас есть 2 заполнителя в самом запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...