выполнить delete, sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) рядом с ",", а я - PullRequest
0 голосов
/ 25 августа 2018

Я хочу удалить дубликаты данных из базы данных. Этот оператор может быть выполнен в navicat.

delete from Proxy_Main 
where (Proxy_Main.ip,Proxy_Main.port) 
       in (select ip,port from Proxy_Main group by ip,port 
           having count(*) > 1) 
   and rowid not in (select min(rowid) from Proxy_Main 
                     group by ip,port having count(*)>1)


информация об ошибке:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) вблизи ",": синтаксическая ошибка [SQL: 'удалить из Proxy_Main, где (Proxy_Main.ip, Proxy_Main.port) в (выбрать ip, порт из группы Proxy_Main по ip, порт с числом ()> 1) и rowid не включен (выберите min (rowid) из группы Proxy_Main по ip, порт с номером ()> 1) '] (фон этой ошибки: http://sqlalche.me/e/e3q8)

   @staticmethod
    def execute(sql):
        conn = engine.connect()
        conn.execute(sql)
        conn.close()

    @staticmethod
    def deduplication():
         SqlHelper.execute('delete from Proxy_Main where (Proxy_Main.ip,Proxy_Main.port) in (select ip,port from Proxy_Main group by ip,port having count(*) > 1) and rowid not in (select min(rowid) from Proxy_Main group by ip,port having count(*)>1)')

1 Ответ

0 голосов
/ 25 августа 2018

Сравнение значений строк при попытке в предложении 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...