在 python (django) 中使用带有参数的游标/查询中的“like”
Posted
技术标签:
【中文标题】在 python (django) 中使用带有参数的游标/查询中的“like”【英文标题】:Using "like" in a cursor/query with a parameter in python (django) 【发布时间】:2010-10-13 05:40:51 【问题描述】:我知道这可能很愚蠢,但我决定问任何方法。
我一直在尝试查询类似:
cursor.execute("select col1, col2 \
from my_tablem \
where afield like '%%s%'
and secondfield = %s
order by 1 desc " % (var1, var2) )
但我在类似的句子中遇到错误。它不喜欢我需要获得包含第一个 %s 值的所有结果的额外 %。
想法?
TIA!
【问题讨论】:
感谢您的快速回答! *** 规则我已经尝试了你的(两个)建议,但没有奏效。虽然我找到了一个我不会放弃的解决方案,使用:like '%%%%%s%%%%' PD:S.Lott:实际查询是更复杂的分组和排序查询 @Juan129:不管它有多复杂。问题仍然存在。你为什么不使用 Django ORM? 嗯,这是一个使用两个表(大表)的查询,通过一个键将它们分组,然后连接以获得另一个ID。我认为在没有多次查询的情况下无法在 django 中进行分组? 【参考方案1】:首先,您为什么不为此使用 Django ORM?
MyClass.objects.filter( aField__contains=var1, secondField__exact=var2 )
其次,确保你得到了你期望的 SQL。
stmt= "select... afield like '%%%s%%' and secondfield = '%s'..." % ( var1, var2 )
print stmt
cursor.execute( stmt )
第三,您的方法存在称为 SQL 注入攻击的安全漏洞。你真的不应该这样做 SQL。
如果你必须在 Django 的 ORM 之外做事,你必须在查询中使用绑定变量,而不是字符串替换。见http://docs.djangoproject.com/en/dev/topics/db/sql/#performing-raw-sql-queries。
【讨论】:
【参考方案2】:可以将字符串 '%' 破解成搜索字符串吗?
var1 = '%' + var1 + '%'
then query normally:
cursor.execute("select col1, col2
from my_tablem where afield like %s
and secondfield = %s
order by 1 desc " , [var1, var2] )
【讨论】:
【参考方案3】:我遇到了类似的问题。我试图在连接的名称字段中进行搜索。我的查询类似于:
sql = """SELECT * from auth_user WHERE lower(first_name) || ' ' || lower(last_name) = '%%%s%%'"""
User.objects.raw(sql, [q])
问题是 %% 破坏了我的查询。我最终得到的解决方案是:
q = '%' + q + '%'
sql = """SELECT * from auth_user WHERE lower(first_name) || ' ' || lower(last_name) = %s"""
User.objects.raw(sql, [q])
【讨论】:
【参考方案4】:Persona.objects.raw("**SELECT** id,concat_ws(' ',nombre,apellido) **AS** nombre_completo **FROM** persona **GROUP BY** id **HAVING** concat_ws(' ',nombre,apellido) **ILIKE** '%s' " % ('%%' + query + '%%'))
(PostgreSQL 9.1)
【讨论】:
以上是关于在 python (django) 中使用带有参数的游标/查询中的“like”的主要内容,如果未能解决你的问题,请参考以下文章
在没有中继的情况下使用带有graphene-django的子字段中的参数进行分页