如果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)
答案 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)