programing

Django: 원시 SQL 쿼리에서 명명된 매개 변수 사용

goodcopy 2023. 1. 30. 22:32
반응형

Django: 원시 SQL 쿼리에서 명명된 매개 변수 사용

동적으로 빌드되는 원시 쿼리를 실행하려고 합니다.파라미터가 유효한 위치에 삽입되도록 하기 위해 명명된 파라미터를 사용합니다.

Sqlite에서는 문제없이 동작할 수 있을 것 같습니다.(모든 테스트 성공) 하지만 MariaDb에 대해 동일한 코드를 실행하면 실패합니다.

간단한 쿼리 예를 다음에 나타냅니다.

 SELECT u.* 
    FROM users_gigyauser AS u
  WHERE u.email like :u_email
    GROUP BY u.id
    ORDER BY u.last_login DESC
  LIMIT 60 OFFSET 0

파라미터는 다음과 같습니다.

 {'u_email': '%test%'}

파라미터가 대체되지 않았기 때문에 발생하는 오류는 기본 구문 오류입니다.'%'을(를) 표시기로 사용하려고 했지만, 이로 인해 sql이 구문 분석을 시도했습니다.

%u[_email]

타입 오류가 반환되었습니다.

다음과 같이 쿼리를 실행합니다.

 raw_queryset = GigyaUser.objects.raw(self.sql_fetch, self._query_object['params'])

또는 셀 때:

 cursor.execute(self.sql_count, self._query_object['params'])

둘 다 MariaDB에서 동일한 오류가 발생하지만 SQLite에서 작동합니다(':' 표시기 사용).

내가 뭘 놓쳤지?

편집:

이 포맷은, 다음의 것을 필요로 합니다.s접미사는 다음과 같습니다.

%(u_email)s

SQLite3를 사용하는 경우 어떤 이유로 구문 지정%(name)s동작하지 않습니다.사용하셔야 합니다.:name매개 변수를 전달하려면 구문 대신{"name":"value"}사전.

첫 번째 구문은 모든 DB 엔진에서 작동해야 한다는 설명서와 반대됩니다.

문제의 출처는 다음과 같습니다.https://code.djangoproject.com/ticket/10070#comment:18

언급URL : https://stackoverflow.com/questions/36311528/django-using-named-parameters-on-a-raw-sql-query

반응형