2013-05-06 5 views
8

私はpythonで新しいです。私はsqlalchemy ormを使用して、私の関数ではキーワードとして中国語を入力します.htmlページは/ user/searchでUnicodeEncodeErrorを与えます: 'latin-1'コーデックは文字を0- 1:序数が範囲外(256)である。 と私のコードは次のようである:UnicodeEncodeError: 'latin-1'コーデックは0〜1の位置にある文字をエンコードできません:序数は範囲外です(256)

def user_search(request): 
    name = request.GET.get('name').strip() 
    user_list = list() 

    if name: 
     user_list = User.get_by_name(name) 

class User(object): 
    @classmethod 
    def get_by_name(cls, name): 
     return DBSession.query(cls).filter(cls.name==name) 

とトレースバックはここにある:

Traceback: 
    File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/home/jiankong/git/admin-server/lib/decorators.py" in wrapper 
    75.      return func(request, *args, **kwargs) 
File "/home/jiankong/git/admin-server/lib/decorators.py" in wrapper 
    39.    output = function(request, *args, **kwargs) 
File "/home/jiankong/git/admin-server/apps/user/user_views.py" in user_search 
    47.  users = jump_page(paginator, page) 
File "/home/jiankong/git/admin-server/apps/user/utils.py" in jump_page 
    92.   return paginator.page(1) 
File "/usr/local/lib/python2.6/dist-packages/django/core/paginator.py" in page 
    37.   number = self.validate_number(number) 
File "/usr/local/lib/python2.6/dist-packages/django/core/paginator.py" in validate_number 
    28.   if number > self.num_pages: 
File "/usr/local/lib/python2.6/dist-packages/django/core/paginator.py" in _get_num_pages 
    60.    if self.count == 0 and not self.allow_empty_first_page: 
File "/usr/local/lib/python2.6/dist-packages/django/core/paginator.py" in _get_count 
    48.     self._count = self.object_list.count() 
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in count 
    2414.   return self.from_self(col).scalar() 
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in scalar 
    2240.    ret = self.one() 
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in one 
    2209.   ret = list(self) 
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in __iter__ 
    2252.   return self._execute_and_instances(context) 
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/orm/query.py" in _execute_and_instances 
    2267.   result = conn.execute(querycontext.statement, self._params) 
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/engine/base.py" in execute 
    664.             params) 
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/engine/base.py" in _execute_clauseelement 
    764.    compiled_sql, distilled_params 
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/engine/base.py" in _execute_context 
    871.          context) 
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.1dev-py2.6-linux-i686.egg/sqlalchemy/engine/default.py" in do_execute 
    324.   cursor.execute(statement, parameters) 
File "/usr/local/lib/python2.6/dist-packages/MySQL_python-1.2.4-py2.6-linux-i686.egg/MySQLdb/cursors.py" in execute 
    183.    query = query % db.literal(args) 
File "/usr/local/lib/python2.6/dist-packages/MySQL_python-1.2.4-py2.6-linux-i686.egg/MySQLdb/connections.py" in literal 
    264.   return self.escape(o, self.encoders) 
File "/usr/local/lib/python2.6/dist-packages/MySQL_python-1.2.4-py2.6-linux-i686.egg/MySQLdb/connections.py" in unicode_literal 
    202.     return db.literal(u.encode(unicode_literal.charset)) 

Exception Type: UnicodeEncodeError at /user/search 
Exception Value: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)` 

私はエラーに会ったとき、私はコードはここにある、それがうまく働いていた、Pythonシェルでテストをしました:

apps.user.modelsインポートユーザから

ユーザー= User.get_by_name( '某人')1次回() 印刷ユーザー 印刷user.name 某人

ので、私はそれが私のhtmlページで働いてみましょうするために何ができるのでしょうか?多くは感謝!

+0

私は 'User.name'の型はStringだと思いますか? Unicodeに変更してください。 – schlamar

答えて

20

私はMySQLを使っていると仮定していますここにMySQLdbドライバがあります。

MySQLdbドライバで使用されるデフォルトのエンコーディングは、文字セットをサポートしていないlatin-1です。 MySQLdb(http://docs.sqlalchemy.org/en/rel_0_8/dialects/mysql.html#unicodeを参照)を介してデータベースと通信できるようにするには、UTF-8(またはその他のUTF-8が最も一般的です)を使用する必要があります。

は、次の行を使用してエンジンを作成し、そのようなことを行うには:

create_engine('mysql+mysqldb://USER:@SERVER:PORT/DB?charset=utf8', encoding='utf-8') 

またsqlalchemy.engine.url.URLクラスを使用して、エンジンのURLを構築し、create engine機能に送信することができます。私はあなたが設定ファイルにあなたの設定を持っていると便利です。

import sqlalchemy.engine.url as url 

engine_url = url.URL(
    drivername='mysql+' + cfg['MYSQL_PYTHON_DRIVER'], 
    host=cfg['MYSQL_HOST'], 
    port=cfg['MYSQL_PORT'], 
    username=cfg['MYSQL_USER'], 
    password=cfg['MYSQL_PWD'], 
    database=cfg['MYSQL_DB'], 
    query={'charset': 'utf8'} 
) 
db = create_engine(engine_url, encoding='utf-8') 

希望します。

+0

ええ、それは今働いた。非常に感謝します。 – jiank

3

あなたのスタックトレースに基づいて、ユニコードエンコードをオンにした状態でMySQL Pythonを使用しています。エンコードを行っているからです。だから、あなたはおそらくcomaptibleエンコーディングを指定する必要があります(これはMySQLdbはDBAPIによって使用されるすべての設定であることに注意し、SQLalhcemyはちょうどを通して渡し):

create_engine('mysql+mysqldb:///mydb?charset=utf8&use_unicode=1') 

http://docs.sqlalchemy.org/en/rel_0_8/dialects/mysql.html#unicode

関連する問題