在 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”的主要内容,如果未能解决你的问题,请参考以下文章

从Django中的GET参数中提取带有索引的数组

在没有中继的情况下使用带有graphene-django的子字段中的参数进行分页

带有参数的 Django 反向 url 到基于类的视图

Python/Django 避免保存内联

如何在 url 上使用带有参数的 Spyne+Django?

使用嵌套结构的参数使用 django-graphene 过滤父级