2014-07-21 1 views
1

사용자 지정 쿼리를 작성하려고하는데 filter() 뒤에 .extra()를 적용하려고합니다.장고 필터 (icontains) .extra 잘못된 SQL 구문을 생성합니다 (따옴표 없음)

V.objects.filter(v_id__product__icontains=name) 

지금은, 그러나, 이름에 따옴표가없는 유효한 SQL, 생산 : 같은 성명은 보이는

:

WHERE `v_id`.`product` LIKE %xxx% 

을하지만을 나는 .extra() 문을 추가 할 때 aroung 따옴표가 없기 때문에

V.objects.filter(id__product__icontains=name).extra(where=[concat_str],params=[version,'%','%']) 
는 쿼리가 무효가 % XXX %

WHERE `v_id`.`product` LIKE %xxx% AND 'yyy' LIKE CONCAT('%',version,'%') 

내가 여기에 필요한 것은이 유효하게 %의 XXX %의 주위에 작은 따옴표를 추가하는 것입니다

WHERE `vulnerabilities_cpeid`.`product` LIKE '%xxx%' AND 'yyy' LIKE CONCAT('%',version,'%') 

하지만, 난 그냥 사용하는 경우 따옴표로 % XXX %를 넣어 장고를 강제하는 방법을 모른다 아이콘. 어떤 도움을 주셔서 감사합니다. 미리 감사드립니다.

전체 역 추적 :

INFO 2014-07-21 11:33:55,515 views: SELECT `vulnerabilities_vulnerability`.`identifier` FROM `vulnerabilities_vulnerability` INNER JOIN `vulnerabilities_vulnerability_cpe_id` ON (`vulnerabilities_vulnerability`.`id` = `vulnerabilities_vulnerability_cpe_id`.`vulnerability_id`) INNER JOIN `vulnerabilities_cpeid` ON (`vulnerabilities_vulnerability_cpe_id`.`cpeid_id` = `vulnerabilities_cpeid`.`id`) WHERE (`vulnerabilities_cpeid`.`product` LIKE %accountsservice% AND '0.6.15-2ubuntu9.7' LIKE CONCAT('%',version,'%')) 
ERROR 2014-07-21 11:33:55,517 django.request: Internal Server Error: /vulndb/inventory/ 
Traceback (most recent call last): 
    File "/home/sapegin/vulndb_mercurial/vulndb/HANA/PYTHON/Python/lib/python2.6/site-packages/django/core/handlers/base.py", line 111, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 
    File "/home/sapegin/vulndb_mercurial/vulndb/vulndb/vulnerabilities/views.py", line 1650, in inventory 
    if ((vulnerabilities is not None) and (vulnerabilities.count() > 0)): 
    File "/home/sapegin/vulndb_mercurial/vulndb/HANA/PYTHON/Python/lib/python2.6/site-packages/django/db/models/query.py", line 351, in count 
    return self.query.get_count(using=self.db) 
    File "/home/sapegin/vulndb_mercurial/vulndb/HANA/PYTHON/Python/lib/python2.6/site-packages/django/db/models/sql/query.py", line 418, in get_count 
    number = obj.get_aggregation(using=using)[None] 
    File "/home/sapegin/vulndb_mercurial/vulndb/HANA/PYTHON/Python/lib/python2.6/site-packages/django/db/models/sql/query.py", line 384, in get_aggregation 
    result = query.get_compiler(using).execute_sql(SINGLE) 
    File "/home/sapegin/vulndb_mercurial/vulndb/HANA/PYTHON/Python/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 818, in execute_sql 
    cursor.execute(sql, params) 
    File "/home/sapegin/vulndb_mercurial/vulndb/HANA/PYTHON/Python/lib/python2.6/site-packages/django/db/backends/util.py", line 40, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/sapegin/vulndb_mercurial/vulndb/HANA/PYTHON/Python/lib/python2.6/site-packages/django/db/backends/mysql/base.py", line 119, in execute 
    return self.cursor.execute(query, args) 
    File "/home/sapegin/vulndb_mercurial/vulndb/HANA/PYTHON/Python/lib/python2.6/site-packages/MySQL_python-1.2.4-py2.6-linux-x86_64.egg/MySQLdb/cursors.py", line 201, in execute 
    self.errorhandler(self, exc, value) 
    File "/home/sapegin/vulndb_mercurial/vulndb/HANA/PYTHON/Python/lib/python2.6/site-packages/MySQL_python-1.2.4-py2.6-linux-x86_64.egg/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
DatabaseError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0.6.15-2ubuntu9.7'' LIKE CONCAT(''%'',version,''%''))' at line 1") 
ERROR 2014-07-21 11:33:55,517 django.request: Internal Server Error: /vulndb/inventory/ 
+3

Django는'% xxx %'주위에 따옴표를 넣었으므로'.query'에서 이것을 볼 수 없습니다. 어떤 오류가 발생합니까? – alecxe

+0

"DatabaseError : (1064,"SQL 구문에 오류가 있습니다 ... ... "그리고 .query로 생성 된 문자열을 복사하고 수동으로 따옴표를 추가 한 다음 mysql 콘솔에서 실행하면 오류가 발생했습니다. –

+0

질문에 전체 추적을 포함하십시오. 감사. – alecxe

답변

1

내가 오류를 내기 당신이 당신의 .extra 호출의 매개 변수에 추가 따옴표를 가지고있다. % s 주변의 따옴표를 제거하고 문제가 해결되는지 확인하십시오.

1

Django에서는 DatabaseWrapper가 자동으로 따옴표를 추가합니다. 'icontains'연산자는 'icontains': 'LIKE %s'으로 변환되며 여기서 %s은 검색어 앞뒤에 % 기호가 연결된 문자열로 바뀝니다.

내부적으로 Django는 quote_name 함수를 사용하여 따옴표를 사용합니다. 내가 alecxe 잘 .query에서 디버그 생각 https://docs.djangoproject.com/en/dev/topics/db/sql/

:

Model.objects.raw('Select .... FROM .... WHERE ....', params=None, translations=None)

가 살펴 유무 :

def quote_name(self, name): 
    if name.startswith("`") and name.endswith("`"): 
     return name # Quoting once is enough. 
    return "`%s`" % name 

아마 당신의 사용 케이스에 대한 원시 쿼리는 더 나은 해결책이 될 수 있습니다 충분하지 않습니다.

관련 문제