使用mySQL原始db查询进行Python字符格式化会给我带来问题

时间:2013-09-27 13:11:41

标签: python mysql sql format

我在尝试在我的网络应用程序上安装搜索功能时遇到问题。问题在于以下代码。我已经尝试了以下两个查询,但是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查询我需要将我的searchparams用百分号括起来,而下面的答案不能这样 -

subject LIKE '%somestringimlookingfor%' 

上面的代码似乎出来'测试'%''。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

而是使用查询参数:

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

应使用%转义百分比符号。

UPD:

略有不同的选择:

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

另见: