Python (Django)의 매개 변수가있는 커서/쿼리에서 "좋아요"사용
문제
나는 이것이 어리석은 일이라는 것을 알고 있지만 어떤 식 으로든 물어보기로 결정했습니다.
나는 다음과 같은 것을 쿼리하려고 노력했습니다.
cursor.execute("select col1, col2 \
from my_tablem \
where afield like '%%s%'
and secondfield = %s
order by 1 desc " % (var1, var2) )
그러나 나는 같은 문장에서 오류가 발생합니다. 첫 번째 % s 값을 포함하는 모든 결과를 얻는 데 필요한 추가 %를 좋아하지 않습니다.
아이디어?
티아!
해결책
먼저, 왜 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.
다른 팁
문자열 '%'를 검색 문자열에 해킹 할 수 있습니까?
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] )
비슷한 문제가있었습니다. 나는 연결된 이름 필드를 검색하려고했다. 내 쿼리는 다음과 같습니다.
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])
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)
제휴하지 않습니다 StackOverflow