Использование «лайка» в курсоре / запросе с параметром в python (django) - PullRequest
5 голосов
/ 13 марта 2009

Я знаю, что это может быть что-то глупое, но я решил спросить в любом случае.

Я пытался запросить что-то вроде:

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

Но я получаю ошибку в подобном предложении. Мне не нравятся дополнительные%, которые мне нужны, чтобы получить все результаты, содержащие первое значение% s.

Идеи

ТИА!

Ответы [ 4 ]

9 голосов
/ 13 марта 2009

Во-первых, почему вы не используете для этого 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, как это.

Если вам абсолютно необходимо делать что-то вне ORM Джанго, вы должны использовать переменные связывания в своем запросе, а не подстановку строк. Смотри http://docs.djangoproject.com/en/dev/topics/db/sql/#performing-raw-sql-queries.

7 голосов
/ 04 июля 2010

может взломать строку '%' в строку поиска?

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 голосов
/ 03 января 2011

У меня была похожая проблема. Я пытался искать среди объединенных полей имени. Мой запрос был что-то вроде:

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])
0 голосов
/ 14 марта 2014
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)

...