jdu*_*ngo 15 python postgresql encoding sqlalchemy
我正在将金字塔用于带有postgres数据库,wtforms,sqlalchemy和jinja2的Web应用程序,当应用程序尝试从数据库中获取问题类型以填充带有wtforms的选择字段时,我遇到此错误:
Error: 'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
这是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
Run Code Online (Sandbox Code Playgroud)
进入bd我有这个:
# select name from ma_issue_types where id = 3;
name
------------
Teléfono
Run Code Online (Sandbox Code Playgroud)
这是发生错误的部分
# -*- 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
Run Code Online (Sandbox Code Playgroud)
这是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)
Run Code Online (Sandbox Code Playgroud)
我试试这个,但它不能在python中作为默认编码使用 ascii
我尝试这样的东西,但它没有用
return dbsession.query(IssueType.id, IssueType.name.encode('utf-8')).all() #or decode('utf-8')
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 38
您需要配置Psycopg2的客户端编码.请参阅SQLAlchemy文档:
默认情况下,psycopg2驱动程序使用
psycopg2.extensions.UNICODE扩展,以便DBAPI直接接收并返回所有字符串作为Python Unicode对象 - SQLAlchemy无需更改即可传递这些值.这里的Psycopg2将根据当前的"客户端编码"设置对字符串值进行编码/解码; 默认情况下,这是postgresql.conf文件中的值,通常默认为SQL_ASCII.通常,这可以更改utf-8为更有用的默认值:Run Code Online (Sandbox Code Playgroud)#client_encoding = sql_ascii # actually, defaults to database # encoding client_encoding = utf8影响客户端编码的第二种方法是在本地将其设置在Psycopg2中.SQLAlchemy的将调用psycopg2的
set_client_encoding()方法(参见:http://initd.org/psycopg/docs/connection.html#connection.set_client_encoding)基于传递到值的所有新连接create_engine()使用的client_encoding参数:Run Code Online (Sandbox Code Playgroud)engine = create_engine("postgresql://user:pass@host/dbname", client_encoding='utf8')这将覆盖Postgresql客户端配置中指定的编码.
该client_encoding参数可以指定为引擎URL中的查询字符串:
postgresql://user:pass@host/dbname?client_encoding=utf8
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10211 次 |
| 最近记录: |