【问题标题】:Python character formatting with mySQL raw db query giving me problems使用 mySQL 原始数据库查询的 Python 字符格式给我带来了问题
【发布时间】:2013-09-27 13:11:41
【问题描述】:

我在尝试在我的 Web 应用程序上安装搜索功能时遇到问题。问题在于以下代码。我尝试了以下两个查询,但 python 给了我一个错误,我将在下面列出:

def searchBox(user_id, searchparams):

try:
    cursor = connection.cursor()

    if cursor:
        sql = "SELECT * FROM db_email WHERE user_id = %d AND deleted = 0 AND subject LIKE '%%%s%%';"
        cursor.execute(sql % (user_id, searchparams)

我也试过了:

try:
    cursor = connection.cursor()

    if cursor:
        sql = "SELECT * FROM db_email WHERE user_id = %d AND deleted = 0 AND subject LIKE " + "'%" + searchparams + "%';"
        cursor.execute(sql % (user_id))

两者都为我返回此错误:

TypeError: not enough arguments for format string

这是我唯一遇到问题的原始查询,它与我需要调用 LIKE 的方式有关。我可以编写一个存储过程来绕过python,但我觉得我在做一些愚蠢的事情并且忽略了一个问题。任何帮助将不胜感激


谢谢。我认为问题的一部分在于我的 LIKE 查询我需要我的搜索参数用百分号括起来,而下面的答案不能像这样工作 -

subject LIKE '%somestringimlookingfor%' 

使用上面的代码,它似乎出来了'test'%''。有什么想法吗?

【问题讨论】:

    标签: python mysql sql format


    【解决方案1】:

    不要对 SQL 查询使用字符串插值,这是完全不安全的。

    改为使用查询参数:

    sql = """SELECT 
                 * 
             FROM 
                 db_email 
             WHERE
                 user_id = %s AND 
                 deleted = 0 AND 
                 subject LIKE '%%%s%%'"""
    cursor.execute(sql, (user_id, searchparams))
    

    百分号应该用%转义。

    更新:

    略有不同的选项:

    sql = """SELECT 
                 * 
             FROM 
                 db_email 
             WHERE
                 user_id = %s AND 
                 deleted = 0 AND 
                 subject LIKE %s"""
    cursor.execute(sql, (user_id, "%" + searchparams + "%"))
    

    另见:

    【讨论】:

    • 谢谢。我认为问题的一部分出在我的 LIKE 查询中,我需要将我的 searchparams 用百分号括起来 - 主题 LIKE '%somestringimlookingfor%' 上面的代码似乎是 'test'%''。有什么想法吗?
    • @Dalbrecht 请参阅答案中的UPD 部分。让我知道它是否适合您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2023-03-30
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多