8

我知道这可能是愚蠢的,但我决定问任何方式。

我一直在尝试查询类似的内容:

 cursor.execute("select col1, col2   \
                    from my_tablem \
                    where afield like '%%s%'
                    and secondfield = %s
                    order by 1 desc " % (var1, var2) )

但是我在类似的句子中遇到错误。它不喜欢我需要获得包含第一个 %s 值的所有结果的额外 % 。

想法?

蒂亚!

4

4 回答 4

9

首先,您为什么不为此使用 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

于 2009-03-13T18:32:31.443 回答
8

可以将字符串 '%' 破解为搜索字符串吗?

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] )
于 2010-07-03T23:32:09.577 回答
4

我有一个类似的问题。我试图在连接的名称字段中进行搜索。我的查询类似于:

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])
于 2011-01-03T18:15:59.550 回答
0
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)

于 2014-03-14T15:42:07.860 回答