2009-03-13 3 views
4

나는 이것이 어리석은 일일 수도 있지만 어떤 식 으로든 물어보기로했습니다."like"를 파이썬 (django)에서 매개 변수와 함께 커서/쿼리에 사용

내가 좋아하는 뭔가를 조회 할 노력했습니다 :

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

을하지만 같은 문장에서 오류가 발생합니다. 그것은 첫 번째 % s 값을 포함하는 모든 결과를 얻는 데 필요한 여분의 %를 좋아하지 않습니다.

아이디어가 있으십니까?

TIA!

+0

감사합니다! StackOverflow 규칙 (둘 다) 제안을 시도했지만 제대로 작동하지 않았습니다. '%%%%% s %%%%' 과 같이 과 같이 끝내지 않는 해결책을 발견했지만 PD : S.Lott : 실제 쿼리는보다 복잡한 그룹화 및 정렬 쿼리입니다 – Juan129

+0

@ Juan129 : 얼마나 복잡한 지 상관 없습니다. 문제는 여전히 남아 있습니다. 왜 장고 ORM을 사용하지 않습니까? –

+0

글쎄, 그것은 두 테이블 (큰 테이블)을 사용하는 쿼리로 키별로 그룹화 한 다음 다른 ID를 얻기 위해 조인합니다. 나는 여러 번 쿼리를하지 않고 그룹화를 장고에서 수행 할 수 없다고 생각 했습니까? – Juan129

답변

8

먼저, 장고 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을 참조하십시오.

6

검색 문자열에 '%'문자열을 해킹 할 수 있습니까?

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]) 
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) 빠른 답변을