2013-02-09 41 views
12

Tôi đang sử dụng kim tự tháp cho ứng dụng web với cơ sở dữ liệu postgres, wtforms, sqlalchemy và jinja2 và tôi gặp phải lỗi này khi ứng dụng cố gắng lấy các loại vấn đề từ cơ sở dữ liệu để điền vào một lựa chọn lĩnh vực với wtforms:Lỗi mã hóa với sqlalchemy và postgresql

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

đây là loại vấn đề bảng vào model.py:

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 

Into bd tôi có điều này:

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

này là phần mà các lỗi xảy ra

# -*- 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 

đây là Traceback

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) 

tôi cố gắng này, nhưng nó đã không làm việc ascii as default encoding in python

và tôi cố gắng một cái gì đó như thế này , nhưng nó không hoạt động

gae python ascii codec cant decode byte

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

Đó là toàn bộ mã. Bạn có thể thử và bản địa hóa vấn đề của mình nhiều hơn và chỉnh sửa câu hỏi của chúng tôi để làm cho nó dễ xử lý hơn không? – millimoose

+0

Lỗi ở đây là trả về dbsession.query (IssueType) .all() – jdurango

+1

Không, đó là nơi lỗi hiển thị. Tôi có nghĩa là cố gắng để gỡ lỗi công cụ để xem những gì được gọi là cuối cùng để xem những gì đang nhận được giải mã bằng cách sử dụng 'ascii' và tại sao? – millimoose

Trả lời

30

Bạn cần định cấu hình mã hóa khách hàng của Psycopg2. Xem SQLAlchemy documentation:

Theo mặc định, người lái xe psycopg2 sử dụng phần mở rộng psycopg2.extensions.UNICODE, như vậy mà DBAPI nhận và trả về tất cả các chuỗi như Python Unicode các đối tượng trực tiếp - SQLAlchemy đi những giá trị thông qua mà không cần thay đổi. Psycopg2 ở đây sẽ mã hóa/giải mã các giá trị chuỗi dựa trên cài đặt “mã hóa khách hàng” hiện tại; theo mặc định, đây là giá trị trong tệp postgresql.conf, thường được đặt mặc định là SQL_ASCII. Thông thường, điều này có thể được thay đổi để utf-8, như một mặc định hữu ích hơn:

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

Một cách thứ hai để ảnh hưởng đến mã hóa client là để thiết lập nó trong vòng Psycopg2 tại địa phương. SQLAlchemy sẽ gọi phương thức set_client_encoding() psycopg2 (xem: http://initd.org/psycopg/docs/connection.html#connection.set_client_encoding) trên tất cả các kết nối mới dựa trên giá trị truyền cho create_engine() sử dụng tham số client_encoding:

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

này ghi đè mã hóa được quy định trong cấu hình máy khách PostgreSQL.

Tham số client_encoding có thể được quy định như một chuỗi truy vấn trong URL động cơ:

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

Cảm ơn bạn rất nhiều, giải pháp đã thay đổi mã hóa trong postgresql.conf – jdurango

+3

bạn cũng có thể đặt ** postgresql: // user: pass @ host/dbname? Client_encoding = utf8 ** –

+0

cảm ơn, điều đó đã giúp – Jake

0

tôi sử dụng mysql và thiết lập charset như thế này. Nó làm việc cho tôi.

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")