【问题标题】:Use %%s% in a SQL statement of a MySQLdb cursor在 MySQLdb 游标的 SQL 语句中使用 %%s%
【发布时间】:2021-08-19 02:19:02
【问题描述】:

我想从我的数据库中选择COLUMN_NAME 值包含字符串的数据,示例如下:

SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER('%foobar%')

上述 SQL 语句应从表 mytable 中选择,其中 COLUMN_NAME 包含 foobar(区分大小写)

但是 foobar 是一个示例,我不确定如何在 Python MySQLdb 查询中实现这一点,同时转义将被放置而不是 foobar 的值

我尝试了以下方法,但它们的语法似乎不正确:

value = "foobar"
cursor.execute("SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER('%%s%')", (value,))
value = "foobar"
cursor.execute("SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER(%%s%)", (value,))
value = "foobar"
cursor.execute("SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER('% %s %')", (value,))

关于如何让它工作的任何帮助?

【问题讨论】:

    标签: python mysql sql mysql-python


    【解决方案1】:

    对于使用百分号 % 的参数化查询,参数值应包含可以用 F 字符串插入的通配符:

    # VALUE WITH WILDCARDS
    value = "foobar"
    param = f"%{value}%"
    
    # PREPARED STATEMENT WITHOUT QUOTES
    sql = "SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER(%s)"
    
    # EXECUTE AND BIND PARAM
    cursor.execute(sql, (param,))
    

    【讨论】:

    • 非常感谢!
    【解决方案2】:
    老实说,我没有用 MySQLdb 测试过,但通常你可以通过加倍来转义格式字符串中的 `%`。

    因此

    value = "foobar"
    cursor.execute("SELECT * FROM mytable WHERE LOWER(COLUMN_NAME) LIKE LOWER('%%%s%%')", (value,))
    

    应该可以。


    更新:

    我提出的解决方案不起作用,因为查询是使用mogrify() 准备的,它使用literal()
    literal 总是添加单引号'。所以查询变为LOWER('%'foobar'%'),无效。

    请考虑Parfait's solution

    【讨论】:

    • 这使它成为LOWER(%'foobar'%),而它应该是LOWER('%foobar%')
    • 我从缺少引号的问题中复制了第二个...我认为(编辑)现在应该这样做,对吗?
    • 现在实际上是LOWER('%'foobar'%')。如果我能去掉foobar 之间的引号,就会亮起来。我可以让它 LOWER("%%%s%%") 让它工作,但它会寻找 'foobar' 而我希望它寻找 foobar
    • 哦,抱歉,我没有正确阅读。恐怕这是不可能的。给我一些时间来检查这个并用解释更新我的答案。
    • @Mario 我的答案是正确的。 % 可以在这里参数化,没有任何问题。对不起,我现在也学到了一些东西。
    猜你喜欢
    • 2015-02-06
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2012-01-10
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多