【问题标题】:Python3.8, MySQL5.7: passing active wildcards to LIKE queryPython3.8、MySQL5.7:将活动通配符传递给 LIKE 查询
【发布时间】:2020-07-20 21:36:44
【问题描述】:

我正在使用 python3.8 和 mysql.connector。我可以参数化包含LIKE 子句的查询并传入活动的% 通配符吗?

为了驯服我尝试过的传入模式:

pattern = re.sub(r'%+', '%', target)
~and~
pattern = re.sub(r'%+', '%%', target)
~and~
pattern = re.sub(r'%+', '\\%', target)

对于我尝试过的查询:

cursor.execute(f"""
    DELETE FROM thnigs
    WHERE user =  %(user)s
        AND widget LIKE %(pattern)s
""", dict(user=username, pattern=pattern))

cursor.execute(f"""
    DELETE FROM thnigs
    WHERE user =  %s
        AND widget LIKE %s
""", (username, pattern))

pattern 可以包含任何东西。我知道 mysql.connector 会转义输入,但如果输入字符串包含任意数量的百分比符号,则查询会挂起:1205 (HY000): Lock wait timeout exceeded; try restarting transaction

我尝试将LIKES 切换为RLIKES a 并将通配符更改为简单的.* 字符串,结果相同——如果有任何有效的通配符,则查询终止。

到目前为止还没有起作用的值:

pattern = "%red"
pattern = "red%"

如果这是不可能的,那么我想我可以提取所有值并在应用程序中本地进行通配符搜索,但这感觉不对。可能的数据集可能会变大。

有没有正确或更好的方法?

** 编辑 ** 添加了我尝试过的另一个 % 替换模式

【问题讨论】:

    标签: python-3.8 mysql-connector-python


    【解决方案1】:

    你必须在传递的sql查询文本中用%%转义%,这是我至少从很久以前就记得的。

    另见

    mysql LIKE with double percent

    还有我的答案。

    【讨论】:

    • 是的,也试过了。如果我设法在字符串中获得一个或多个 %s,则查询会。
    • @7Reeds 意味着它现在可以工作了吗?或者你的意思是你试过了,但最后还是没有解决?只是为了确保我理解您的评论。
    • 刚回去检查。如果我的初始字符串是“%red”或“red%”并且百分号加倍,那么它可以工作,谢谢。如果初始字符串是 "%red%" 并且百分比加倍为 "%%red%%" 则抛出上述异常。
    • 我让 RLIKE 开始工作。从来没有发现常规 LIKE 和 %s 的魔力。干杯
    • @7Reeds 那么这不能称为完全解决,也许其他人会贡献。无论如何它可能是重复的,一年前我遇到了同样的问题,我在当时现有的 SO 线程的帮助下让它工作。如果它不是重复的,那么无论如何你的问题都会得到更多的关注。
    猜你喜欢
    • 2022-11-20
    • 1970-01-01
    • 2018-06-16
    • 2017-06-28
    • 2011-08-07
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2021-06-23
    相关资源
    最近更新 更多