Сравнение значений строк при попытке в предложении IN
доступно только в SQLite 3.15 + . Как уже упоминалось в самой нижней части страницы связанных документов:
Значения строк были добавлены в SQLite версии 3.15.0 (2016-10-14). Попытки использовать значения строк в предыдущих версиях SQLite приводят к синтаксическим ошибкам.
Проверьте вашу версию (SELECT sqlite_version();
). Обновите по мере необходимости, поскольку ваш запрос работает с обновленной версией (запустите пример SQL Fiddle ).
В качестве альтернативы рассмотрим более ANSI-SQL-решение (т. Е. Переносимое через СУБД) с использованием подзапроса агрегированного соединения:
DELETE FROM Proxy_Main
WHERE rowid IN
(SELECT p.rowid
FROM Proxy_Main p
INNER JOIN
(SELECT ip, port, MIN(rowid) As min_id
FROM Proxy_Main
GROUP BY ip, port
HAVING COUNT(*) > 1) AS agg
ON p.ip = agg.ip AND p.port = agg.port
AND p.rowid <> agg.min_id);
Демонстрация Fiddle (нажмите Run наверху)
Обратите внимание, что вы можете передавать многострочные запросы в Python с тройными кавычками.
@staticmethod
def deduplication():
sql = """DELETE FROM Proxy_Main
WHERE rowid IN
(SELECT p.rowid
FROM Proxy_Main p
INNER JOIN
(SELECT ip, port, MIN(rowid) As min_id
FROM Proxy_Main
GROUP BY ip, port
HAVING COUNT(*) > 1) AS agg
ON p.ip = agg.ip AND p.port = agg.port
AND p.rowid <> agg.min_id);"""
SqlHelper.execute(sql)