2014-11-12 4 views
0

임의의 쿼리를 서버 측에 게시합니다. 그러면 쿼리가 실행되고 결과 집합이 클라이언트로 다시 전송됩니다. 일반적인 쿼리는 다음과 같습니다.쿼리를 실행하거나 jsonpickle에서 UnicodeDecodeError

select Наименование from sys_Атрибут where Наименование = 'Район' 

여기서 알 수 있듯이 비 영어권 리터럴이 포함되어 있습니다. 이 쿼리는 실행되지 않습니다. 그러나, 이렇게 쓰면

select Наименование AS attr from sys_Атрибут where Наименование = 'Район' 

그렇다면 괜찮습니다. 서버 측 코드는 다음과 같습니다.

#--coding: utf-8 
from __future__ import unicode_literals 
... 
import pyodbc # tried both of them 
import pypyodbC# 

def resultset(request): 
    query = request.POST['query'] 
    query = u'{}'.format(query) 
    cnx = pyodbc.connect("DRIVER=FreeTDS;SERVER=192.168.0.1;PORT=1433; 
    DATABASE = mydatabase;UID=sa;PWD=password;TDS_Version=7.0;ClientCharset=UTF8;") 
    cursor = cnx.cursor() 
    cursor.execute(query.encode('utf-8')) 
    columns = [desc[0] for desc in cursor.description] # sometimes error happens at this point 
    data = [] 
    output = [] 
    for row in cursor: 
     data.append(dict(zip(columns, row)))    
    output = '{items:' 
    output += jsonpickle.encode(data) # sometimes at that point 
    output += '}' 
    return HttpResponse(output) 

전체 문제점은 테이블 필드의 이름에 있습니다. 나는이 문제를 해결하기 위해 다른 방식으로 data.append(dict(zip(columns, row)))을 코딩해야한다고 생각한다.

답변

0

분명히 말하면 서버에 원시 쿼리를 보내지 않아야합니다. 둘째, unicode_literalsu"" 문자열을 사용하는 것이 이상합니다. 셋째, 유니 코드 문자열을 사용하고 나서 utf-8으로 덤프하는 것은 이상합니다. 나는 (http://kunststube.net/encoding/. 가능성이 제시되고있는 실제 문제를 해결하기

이 오류가 pyodbc 라이브러리 가능성이 [시작 인코딩에 최대 읽기] 건의 할 것입니다. 당신이에 연결하고 생각했다 무엇 데이터베이스 다른 드라이버를 사용하고 있습니까? 데이터베이스가 실행하려고하는 쿼리를 지원하는 경우 (select unicode from table where field = 'value') 드라이버가 엉망이 될 가능성이 있습니다.