我正在使用Django 1.7。
我正在尝试实现搜索功能。当输入搜索词时,我需要在DB中搜索该术语的所有表和所有列(我只有7个表,总共可能有40个列,而且DB不是很大)。我使用MySQL作为数据库。
我可以使用以下代码查询1个表,所有列
query = Q(term__contains=tt) | Q(portal__contains=tt) | ......so on
data = ABC.objects.filter(query)
我尝试使用UNION,编写类似
的SQLselect * from table A where col1 like %s OR col2 like %s .....
UNION
select * from table B where col1 like %s OR col2 like %s .....
当我尝试如下所示实现此功能时,我收到错误“格式字符串的参数不足
cursor = connection.cursor()
cursor.execute("select * from table A where col1 like %s OR col2 like %s
UNION
select * from table B where col1 like %s OR col2 like %s", tt)
那么如何传递多个变量的参数(即使在这种情况下它们是相同的)?我也试过多次传递它。
感谢。
答案 0 :(得分:1)
您应该传递参数列表。参数数量应与%s
占位符的数量匹配:
cursor.execute("select * from table A where col1 like %s OR col2 like %s
UNION
select * from table B where col1 like %s OR col2 like %s",
[tt] * 4) # four `%s`
作为替代方案,您可以尝试使用numeric
paramstyle进行查询。在这种情况下,单个参数的列表就足够了:
cursor.execute("select * from table A where col1 like :1 OR col2 like :1
UNION
select * from table B where col1 like :1 OR col2 like :1",
[tt])
更新:请注意,tt
变量在开头/结尾应包含%
个符号:
tt = u'%' + string_to_find + u'%'
UPDATE 2 :cursor.fetchall()
返回元组列表(不是dicts),因此您应该通过索引访问此数据:
{% for row in data %}
<div>Col1: {{ row.0 }} - Col2: {{ row.1 }}</div>
{% endfor %}