【问题标题】:Python running SQL query With WHERE IN {list} and list is too longPython 使用 WHERE IN {list} 运行 SQL 查询并且列表太长
【发布时间】:2018-11-12 02:00:32
【问题描述】:

这是我的脚本的一部分:

sql1 = """
                    SELECT distinct th.name, 'MMS' as Status
                    FROM t1 
                    JOIN t2 on t1.id = t2.tid
                    WHERE t2.station= 'MatS'
                    AND t1.name IN ({listthinglist})
        """.format(listthinglist=', '.join("'" + item + "'" for item in list_of_things))
    cur.execute(sql1)

list_of_things 包含 22016 个项目,我无法在 python 中运行此查询。有没有其他方法可以在 python 中运行这样的查询。

【问题讨论】:

  • “无法运行”是什么意思?您是否看到错误消息?
  • 您可以批量处理并在每次迭代时添加结果
  • @PatrickHaugh 我的猜测是查询字符串的大小比 DBMS 可以处理的要大。
  • 创建一个临时表并使用它:stackoverflow.com/a/48392389/2681632。并且不要使用字符串格式将值传递给 SQL 查询。

标签: python sql list pandas


【解决方案1】:

请不要为此使用formatexecute 函数接受一个“参数”参数,您可以将列表传递给该参数。你可以这样修改:

sql1 = """
  SELECT distinct th.name, 'MMS' as Status
  FROM t1 
  JOIN t2 on t1.id = t2.tid
  WHERE t2.station= 'MatS'
  AND t1.name IN (%s)
"""
cur.execute(sql1, (list_of_things,))

【讨论】:

  • 这不会仍然执行一个疯狂大小的查询字符串吗?
  • 试一试,如果它产生错误,请发布确切的错误消息。
  • 这不是我的工作,要么是你的,要么是 OP 的。我问你,因为你发布了答案,你应该知道它的作用。
  • 我知道它的作用,但不可能知道它是如何在 OPs 特定服务器上运行的。
  • 不反驳,但是您会知道它是将参数插入字符串还是以其他方式执行它们,不是吗?这就是我要问的。我不是 sql 人,我是 pandas 人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
相关资源
最近更新 更多