2013-02-09 4 views
12

postgres 데이터베이스, wtforms, sqlalchemy 및 jinja2가있는 웹 응용 프로그램에 피라미드를 사용하고 있습니다. 응용 프로그램이 데이터베이스에서 문제 유형을 선택하려고 할 때이 오류가 발생합니다. wtforms 필드 :이 model.py에 문제 유형 테이블sqlalchemy 및 postgresql 인코딩 오류

Error: 'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128) 

:

class Mixin(object): 
    id = Column(Integer, primary_key=True, autoincrement=True) 
    created = Column(DateTime()) 
    modified = Column(DateTime()) 

    __table_args__ = { 
     'mysql_engine': 'InnoDB', 
     'mysql_charset': 'utf8' 
    } 
    __mapper_args__ = {'extension': BaseExtension()} 

class IssueType(Mixin, Base): 
    __tablename__ = "ma_issue_types" 
    name = Column(Unicode(40), nullable=False) 

    def __init__(self, name): 
     self.name = name 

는 BD에 부탁이 있습니다

# select name from ma_issue_types where id = 3; 
name  
------------ 
Teléfono 
,

이 오류가

# -*- coding: utf-8 -*- 

from issuemall.models import DBSession, IssueType 


class IssueTypeDao(object): 

    def getAll(self): 
     dbsession = DBSession() 
     return dbsession.query(IssueType).all() #HERE THROWS THE ERROR 

이이

Traceback (most recent call last): 
    File "/issueMall/issuemall/controller/issueRegisterController.py", line 16, in issue_register 
    form = IssueRegisterForm(request.POST) 
    File "/env/lib/python2.7/site-packages/wtforms/form.py", line 178, in __call__ 
    return type.__call__(cls, *args, **kwargs) 
    File "/env/lib/python2.7/site-packages/wtforms/form.py", line 224, in __init__ 
    super(Form, self).__init__(self._unbound_fields, prefix=prefix) 
    File "/env/lib/python2.7/site-packages/wtforms/form.py", line 39, in __init__ 
    field = unbound_field.bind(form=self, name=name, prefix=prefix, translations=translations) 
    File "/env/lib/python2.7/site-packages/wtforms/fields/core.py", line 301, in bind 
    return self.field_class(_form=form, _prefix=prefix, _name=name, _translations=translations, *self.args, **dict(self.kwargs, **kwargs)) 
    File "/issueMall/issuemall/form/generalForm.py", line 11, in __init__ 
    types = issueTypeDao.getAll() 
    File "/issueMall/issuemall/dao/master/issueTypeDao.py", line 11, in getAll 
    return self.__dbsession.query(IssueType).all() 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/query.py", line 2115, in all 
    return list(self) 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/query.py", line 2341, in instances 
    fetch = cursor.fetchall() 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 3205, in fetchall 
    l = self.process_rows(self._fetchall_impl()) 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/engine/base.py", line 3172, in _fetchall_impl 
    return self.cursor.fetchall() 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128) 

내가 이것을 시도 역 추적하다 발생하는 부분이지만, ascii as default encoding in python

를 작동하지 않았다 나는 이런 식으로 뭔가를 시도 , 그러나 작동하지 않았다.

gae python ascii codec cant decode byte

return dbsession.query(IssueType.id, IssueType.name.encode('utf-8')).all() #or decode('utf-8') 
+0

많은 코드가 있습니다. 문제를 좀 더 현지화하고 좀 더 다루기 쉽도록 질문을 편집 할 수 있습니까? – millimoose

+0

여기에 오류가 있습니다. dbsession.query (IssueType) .all()이 반환됩니다. – jdurango

+1

아니요, 이것이 오류가 나타나는 곳입니다. 나는'ascii '를 사용하여 무엇이 디코드되고 있는지를 알기 위해 마지막에 무엇이 호출되는지를보기 위해 디버깅을 시도하는 것을 의미한다. 왜 그런가? – millimoose

답변

30

Psycopg2의 클라이언트 인코딩을 구성해야합니다. 참조 SQLAlchemy documentation : 기본적으로

에서, psycopg2 드라이버가 psycopg2.extensions.UNICODE 확장자를 사용하는의 DBAPI 수신 및 파이썬 유니 코드 개체를 직접 모든 문자열을 반환하도록 - SQLAlchemy의 변화없이이 값을 통해 전달합니다. Psycopg2는 현재 "클라이언트 인코딩"설정을 기반으로 문자열 값을 인코딩/디코딩합니다. 기본값은 postgresql.conf 파일의 값이며, 기본값은 SQL_ASCII입니다. 일반적으로이보다 유용한 기본으로, utf-8로 변경할 수 있습니다

#client_encoding = sql_ascii # actually, defaults to database 
          # encoding 
client_encoding = utf8 

클라이언트 인코딩에 영향을 미치는 두 번째 방법은 로컬 Psycopg2 내에서 설정하는 것입니다. client_encoding 매개 변수를 사용하여 create_engine()에 전달 된 값을 기준으로 모든 새로운 연결에 : SQLAlchemy의는 psycopg2의 set_client_encoding() 방법 (http://initd.org/psycopg/docs/connection.html#connection.set_client_encoding 참조)를 호출합니다

engine = create_engine("postgresql://user:[email protected]/dbname", client_encoding='utf8') 

이것은 PostgreSQL의 클라이언트 구성에 지정된 인코딩을 무시합니다.

client_encoding 매개 변수

는 엔진 URL에서 쿼리 문자열로 지정할 수 있습니다

postgresql://user:[email protected]/dbname?client_encoding=utf8 
+2

고맙습니다. 솔루션은 postgresql.conf의 인코딩을 변경했습니다. – jdurango

+3

** postgresql : // user : pass @ host/dbname? client_encoding = utf8 ** –

+0

감사합니다. – Jake

0

내가 MySQL을 사용하고 같은 문자 집합을 설정합니다. 그것은 나를 위해 작동합니다.

from sqlalchemy import create_engine 
from sqlalchemy.engine.url import URL 

db_url = { 
    'database': 'db_name', 
    'drivername': 'mysql', 
    'username': 'username', 
    'password': 'mypassword', 
    'host': '127.0.0.1', 
    'query': {'charset': 'utf8'}, 
} 

engine = create_engine(URL(**db_url), encoding="utf8") 
관련 문제