在python中,根据函数变量更改MySQL查询

时间:2010-05-10 03:00:02

标签: python mysql function

如果user_id!= None,我希望能够为查询添加限制...例如:

"AND user_id = 5" 

但我不知道如何将其添加到下面的函数中?

谢谢。

def get(id, user_id=None):

    query = """SELECT *
               FROM USERS
               WHERE text LIKE %s AND
                     id = %s
            """
    values = (search_text, id)

    results = DB.get(query, values)

这样我可以打电话:

get(5)
get(5,103524234) (contains user_id restriction)

3 个答案:

答案 0 :(得分:4)

def get(id, user_id=None):

    query = """SELECT *
               FROM USERS
               WHERE text LIKE %s AND
                     id = %s
            """
    values = [search_text, id]

    if user_id is not None:
        query += ' AND user_id = %s'
        values.append(user_id)

    results = DB.get(query, values)

如您所见,原始代码的主要区别在于中间的小if块,如果需要,它会丰富查询字符串和值。我还将values列为一个列表,而不是一个元组,因此可以使用更自然的append而不是

来丰富它。
         values += (user_id,)

可以说是可读性较低 - 但是,如果你想因某些其他原因保留values一个元组,你可以使用它。

编辑:OP现在在评论(!)中澄清他的原始查询有一个结束LIMIT子句。在这种情况下,我建议采用不同的方法,例如:

   query_pieces = ["""SELECT *
                     FROM USERS
                     WHERE text LIKE %s AND
                         id = %s
                   """, "LIMIT 5"]
    values = [search_text, id]

    if user_id is not None:
        query_pieces.insert(1, ' AND user_id = %s')
        values.append(user_id)

    query = ' '.join(query_pieces)
    results = DB.get(query, values)

您可以通过其他方式执行此操作,但是以正确的顺序保存查询部分列表,随着时间的推移丰富它(例如通过insert),并在最后加入一些空格,是相当普遍和有用的方法。

答案 1 :(得分:2)

像以下一样出了什么问题:

def get(id, user_id=None):
    query = "SELECT * FROM USERS WHERE text LIKE %s"
    if user_id != None:
        query = query + " AND id = %s"%(user_id)
    :
    :

这种语法可能并不完美,我暂时还没有完成Python - 我只是试图了解基本思想。这默认为None大小写,只有在您提供真实用户ID时才会添​​加额外限制。

答案 2 :(得分:1)

您可以使用条件列表构建SQL查询:

def get(id, user_id=None):
    query = """SELECT *
               FROM USERS
               WHERE 
            """
    values = [search_text, id]
    conditions=[
        'text LIKE %s',
        'id = %s']
    if user_id is not None:
        conditions.append('user_id = %s')
        values.append(user_id)
    query+=' AND '.join(conditions)+' LIMIT 1'
    results = DB.get(query, values)