문제

나는 이것이 어리석은 일이라는 것을 알고 있지만 어떤 식 으로든 물어보기로 결정했습니다.

나는 다음과 같은 것을 쿼리하려고 노력했습니다.

 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)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top