Это больше SQL-запрос, чем Python, но все же я постараюсь ответить на него:
(Я не работал с MySQL, но с PostgreSQL, поэтому здесь возможны небольшие различия в интерпретации).
когда вы сделали
cursor.execute('select barcode from fridge where amount < quantity')
db.commit()
row = cursor.fetchall()
переменная 'row' теперь является результирующим набором (чтобы понять: список строк из базы данных)
что-то вроде [(штрих-код1), (штрих-код2), (штрих-код3) ..]
при выполнении оператора обновления
cursor.execute('update products set stock = 0 where barcode = %s', row)
это превращается во что-то вроде:
update products set stock = 0 where barcode = [(barcode1), (barcode2), (barcode3)..]
, который не является правильным оператором SQL.
вы должны сделать что-то вроде этого:
cursor.execute('update products set stock = 0 where barcode in (%s)', ','.join([each[0] for each in row]))
или лучше, оптимизированная вещь:
import MySQLdb
def order():
db = MySQLdb.connect(host='localhost', user='root', passwd='$$', db='fillmyfridge')
cursor = db.cursor()
cursor.execute('update products set stock = 0 where barcode in (select barcode from fridge where amount < quantity)')
db.commit()
Ну, чтобы добавить больше, у вас есть db.commit () после запроса select, а не после запроса обновления, это основная ошибка. Select является идемпотентом, не требует фиксации, тогда как Update делает. Я настоятельно рекомендую вам пройтись по SQL, прежде чем продолжить.