【问题标题】:Parameterize an MySQL IN clause in Python code在 Python 代码中参数化 MySQL IN 子句
【发布时间】:2021-08-27 17:02:49
【问题描述】:

我在看这个类似的问题:Parameterize an SQL IN clause 但是解决方案不是使用 Python,所以我不得不提出一个新问题: 如何参数化包含 IN 子句的查询,字符串 'ruby','rails','scruffy','rubyonrails' 来自数据框的列

SELECT * FROM Tags 
WHERE Name IN ('ruby','rails','scruffy','rubyonrails')
ORDER BY Count DESC

数据框df 可能如下所示:

column1  column2...
ruby     .
rails    . 
scruffy  .
xxx
xxxx

这是我尝试过的: 我将第一列转换为列表并将其命名为list,然后更新查询中的第二行:

WHERE Name IN %(list)s

但这给了我一个错误:sqlalchemy.exc.ProgrammingError: (MySQLdb._exceptions.ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where Name IN (('ruby','rails','xxx','xxxx','xxx','' at line 2")

我也尝试list = str(list)[1:-1] 删除方括号,但随后出现错误:MySQLdb._exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where Name IN ('\\'ruby\\', \\'rails\\', \\'xxxxx\\', \\'xxx\\',' at line 2")

我的问题是我应该为df[column1] 使用什么格式/数据类型才能使其正常工作?有人可以帮忙吗?谢谢。

【问题讨论】:

  • 更新:我已经解决了这个问题,原来我只需要将它转换为列表(带方括号),不需要删除括号否则它将不起作用!

标签: python mysql sql pandas


【解决方案1】:

这里唯一的答案不起作用,因为我已经解决了这个问题,所以这里是解决方案:原来我只需要将它转换为列表(带方括号),不需要删除括号否则它不行!

【讨论】:

    【解决方案2】:

    也许您可以将列列表转换为元组:

    col_tuple = tuple(list)
    

    然后在查询中使用 python f-string:

    f"""SELECT * FROM Tags 
    WHERE Name IN {col_tuple}
    ORDER BY Count DESC"""
    

    【讨论】:

    • 您好,谢谢,我不确定这是否有效,因为在我的查询中,我有几个其他参数化字符串,如日期等,它们在 MySQL 查询中使用%(date)s 格式。
    猜你喜欢
    • 2016-06-17
    • 2010-09-25
    相关资源
    最近更新 更多