【问题标题】:execute delete,sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near ",",while i执行删除,sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) 靠近“,”,而我
【发布时间】:2019-01-31 17:39:16
【问题描述】:

我想从数据库中删除重复数据, 这条语句可以在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) in (select ip,port from Proxy_Main 按 ip 分组,端口 count() > 1) 且 rowid 不在(选择 min(rowid) from Proxy_Main group by ip,port有count()>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)')

【问题讨论】:

  • 您可能需要仔细检查 sqlite 的网站,但我感觉它不支持元组 (a, b) in (select a, b from ...) 样式比较...

标签: python sql sqlite


【解决方案1】:

IN 子句中尝试的行值比较仅在SQLite 3.15+ 中可用。如链接文档页面的最底部所述:

行值已添加到 SQLite 版本 3.15.0 (2016-10-14)。尝试在 SQLite 的早期版本中使用行值将产生语法错误。

检查您的版本 (SELECT sqlite_version();)。根据需要升级,因为您的查询确实适用于更新的版本(运行示例SQL Fiddle)。

或者,考虑使用聚合连接子查询的更符合 ANSI-SQL 的解决方案(即,可跨 RDBMS 移植):

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 Demo(按顶部的运行)


请注意,您可以在 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)

【讨论】:

  • 好奇什么有帮助:新查询或更新 SQLite?
  • 不好意思,刚刚看到回复,我用的是你上面说的SQL语句,谢谢~
【解决方案2】:

在airflow.cfg 文件(2.0 版)中设置 max_num_rendered_ti_fields_per_task = -1

这对我有用。

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 2019-02-07
    • 2020-02-06
    • 2019-01-12
    • 2014-05-17
    • 2021-10-19
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多