在Python中,根据函数变量更改MySQL查询
我想在查询中添加一个限制条件,如果用户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
方法),最后用一些空格把它们连接起来,这是一种相当通用且实用的方法。