cursor.execute('''DELETE FROM transactions
WHERE username in
(SELECT username FROM transactions WHERE username=:username AND item_name=:item_name LIMIT 1)
''',{'username':username,'item_name':item_name})
вернет только один столбец имя пользователя из подзапроса НО , который затем удалит все строки, имеющие извлеченное имя пользователя из подзапроса.
Что вы можете сделать: -
cursor.execute('''DELETE FROM transactions
WHERE rowid =
(SELECT rowid FROM transactions WHERE username=:username AND item_name=:item_name LIMIT 1)
''',{'username':username,'item_name':item_name})
Но только если таблица не была определена с помощью предложения WITHOUT ROWID.
rowid - это специальный, обычно скрытыйстолбец, который однозначно идентифицирует строку и, таким образом, извлекает rowid и использует его в предложении WHERE для идентификации этой конкретной строки.
Обратите внимание, что в теории любой изстроки, которые соответствуют item_name и username, могут быть удалены не обязательно первыми.На самом деле вы должны использовать предложение ORDER BY, чтобы первая строка была ожидаемой.Однако приведенное выше, скорее всего, сработает, поскольку порядок, как ни один из них не указан, скорее всего будет соответствовать rowid , поскольку это будет используемый индекс.
Поскольку у вас нет полезного индекса, выможет использовать rowid как для ORDER (rowid обычно будет соответствовать порядку вставки, т.е. первая вставка будет иметь rowid 1, затем, вероятно, 2 и 3 и т. д.).Таким образом, более правильный код может быть: -
cursor.execute('''DELETE FROM transactions
WHERE rowid =
(SELECT rowid FROM transactions WHERE username=:username AND item_name=:item_name ORDER BY rowid LIMIT 1)
''',{'username':username,'item_name':item_name})