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

0 投票
3 回答
716 浏览
提问于 2025-04-15 22:32

我想在查询中添加一个限制条件,如果用户ID不为空的话... 比如说:

"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 个回答

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)
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时,才会增加额外的限制。

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 是元组的话,你也可以继续使用它。

编辑:提问者现在在评论中澄清了,他原来的查询有一个结尾的 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 方法),最后用一些空格把它们连接起来,这是一种相当通用且实用的方法。

撰写回答