SQLAlchemy - как избежать ошибки: UnicodeEncodeError: кодек «latin-1» не может кодировать символы - PullRequest
2 голосов
/ 17 января 2012

Вот колонка модели:

title = Column(Unicode(100))

Когда я пытаюсь добавить запись в БД с кириллическими буквами в title, я получаю сообщение об ошибке:

UnicodeEncodeError: кодек latin-1 'не может кодировать символы в позиции ...

Если я закодирую его с помощью utf-8

title = request.POST['title'].encode('utf-8')

Я получаю следующую ошибку:

ProgrammingError: Вы не должны использовать 8-битные строки байтов, если вы не используете text_factory, которая может интерпретировать 8-битные строки btystrings (например, text_factory = str). Настоятельно рекомендуется вместо этого просто переключить свое приложение на строки Unicode.

Когда я декодирую UTF-8

title = request.POST['title'].decode('utf-8')

Появилась новая ошибка

UnicodeDecodeError: кодек «ascii» не может кодировать символы ...

Что делать?

EDIT:

Я использую Sqlite3 , я подумал, что это может быть важно.

РЕДАКТИРОВАТЬ 2: (код и обратная связь)

Мой код:

title = request.POST['title']

new_model = Model(
    ...
    title = title,
    ...
)
DBSession.add(new_model)
DBSession.flush()

И трассировка (последний вызов был последним):

Файл "/home/p/work/SUN/lib/python2.6/site-packages/pyramid_debugtoolbar-0.9.7-py2.6.egg/pyramid_debugtoolbar/panels/performance.py", строка 55, в resource_timer_handler

результат = обработчик (запрос)

Файл "/home/p/work/SUN/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/tweens.py", строка 20, в excview_tween

ответ = обработчик (запрос)

Файл "/home/p/work/SUN/lib/python2.6/site-packages/pyramid_tm-0.3-py2.6.egg/pyramid_tm/init.py", строка 61, в tm_tween

response = обработчик (запрос)

Файл "/home/p/work/SUN/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/router.py", строка 164, в handle_request

response = view_callable (context, request)

Файл "/home/p/work/SUN/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/config/views.py", строка 316, в rendered_view

результат = просмотр (контекст, запрос)

Файл "/home/p/work/SUN/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/config/views.py", строка 426, в _requestonly_view

ответ = просмотр (запрос)

Файл "/home/p/work/SUN/sunviver/sunviver/views/advert.py", строка 187, в create

вернуть HTTPFound (location = new_advert.url ())

Файл "/home/p/work/SUN/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/httpexceptions.py", строка 444, в init

body_template = body_template, location = location, ** кВт)

Файл "/home/p/work/SUN/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/httpexceptions.py", строка 213, в init

Ответ. init (self, status = status, ** kw)

Файл "build / bdist.linux-i686 / egg / webob / response.py", строка 141, в init

setattr (self, name, value)

Файл "build / bdist.linux-i686 / egg / webob / descriptors.py", строка 112, в fset

value = value.encode ('latin-1')

И new_advert.url():

def url(self):
    return '/%s/%s' % (self.id, self.title.replace(' ', '_'))

@J.F. Sebastian

Трассировка (последний последний вызов): Файл "/usr/lib/python2.6/wsgiref/handlers.py", строка 93, в прогоне

self.result = приложение (self.environ, self.start_response)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/router.py", строка 187, в call

response = self.handle_request (запрос)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid_debugtoolbar-0.9.7-py2.6.egg/pyramid_debugtoolbar/toolbar.py", строка 157, в toolbar_tween

toolbar.process_response (ответ)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid_debugtoolbar-0.9.7-py2.6.egg/pyramid_debugtoolbar/toolbar.py", строка 55, в process_response

vars, request = request)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg / pyramid / renderers.py ", строка 81, в рендере

return helper.render (значение, None, request = request)

File" /home / ponomar / v / ENV / lib / python2.6 / site-packages / pyramid-1.3a3-py2.6.egg / pyramid / renderers.py ", строка 420, в рендере

result = renderer (значение, system_values)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/mako_templating.py ", строка 162, в вызов

reraise (MakoRenderingException (errtext), Нет, exc_info [2])

Файл"/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/mako_templating.py", строка 154, в вызов

result = template.render_unicode (** system)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg / mako / template.py ", строка 311, в render_unicode

as_unicode = True)

File" / home /ponomar / v / ENV / lib / python2.6 / site-packages / Mako-0.5.0-py2.6.egg / mako / runtime.py ", строка 660, в _render

** _kwargs_for_callable (callable_, data))

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako / runtime.py ", строка 692, в _render_context

_exec_template (наследовать, lclcontext, args = args, kwargs = kwargs)

File" / home / ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py ", строка 718, в _exec_template

callable_ (context, * args, ** kwargs)

Файл "pyramid_debugtoolbar_templates_toolbar_mako", строка 117, в render_body

Файл "/home/ponomar/v/ENV/lib/python2.6/ сиte-packages / pyramid_debugtoolbar-0.9.7-py2.6.egg / pyramid_debugtoolbar / Panel / headers.py ", строка 54, в содержании

vars, self.request)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid_debugtoolbar-0.9.7-py2.6.egg/pyramid_debugtoolbar/panels/init.py", строка 24, в render

return render (template_name, vars, request = request)

File" / home / ponomar / v / ENV / lib / python2.6 / site-packages / pyramid-1.3a3-py2.6.egg / pyramid / renderers.py ", строка 81, в рендере

return helper.render (значение None, request =запрос)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/renderers.py",строка 420, в рендере

result = рендерер (значение, системные значения)

File "/home/ponomar/v/ENV/lib/python2.6/site-пакеты / pyramid-1.3a3-py2.6.egg / pyramid / mako_templating.py ", строка 162, в вызов

ререйз (MakoRenderingException (errtext), Нет, exc_info [2])

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg / pyramid / mako_templating.py ", строка 154, в вызов

result = template.render_unicode (** system)

Файл"/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/template.py", строка 311, в render_unicode

as_unicode = True)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py ", строка 660, в _render

** _ kwargs_for_callable (callable_, data))

File" / home / ponomar / v / ENV / lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py ", строка 692, в _render_context

_exec_template (наследовать, lclcontext, args =args, kwargs = kwargs)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py", строка 718, в _exec_template

callable_ (context, * args, ** kwargs)

Файл "pyramid_debugtoolbar_panels_templates_headers_mako", строка 34, в render_body

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/MarkupSafe-0.15-py2.6.egg/markupsafe/_native.py", строка 21, в escape

возврат разметки (Unicode (s)

MakoRenderingException:

Трассировка (последний последний вызов):

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/mako_templating.py", строка 154, в call

result = template.render_unicode (** system)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/template.py", строка 311, в render_unicode

as_unicode = True)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py", строка 660, в _render

** _ kwargs_for_callable (callable_, data))

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py", строка 692, в _render_context

_exec_template (наследовать, lclcontext, args = args, kwargs = kwargs)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py", строка 718, в _exec_template

callable_ (context, * args, ** kwargs)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid_debugtoolbar-0.9.7-py2.6.egg/pyramid_debugtoolbar/templates/toolbar.mako", строка 61, в render_body

$ {panel.content () | п}

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid_debugtoolbar-0.9.7-py2.6.egg/pyramid_debugtoolbar/panels/headers.py", строка 54, в содержании

vars, self.request)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid_debugtoolbar-0.9.7-py2.6.egg/pyramid_debugtoolbar/panels/init.py" строка 24, в рендере

return render (template_name, vars, request = request)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/renderers.py", строка 81, в визуализации

return helper.render (значение, Нет, запрос = запрос)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/renderers.py", строка 420, в визуализации

результат = средство визуализации (значение, системное значение)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/mako_templating.py", строка 162, в вызове

reraise (MakoRenderingException (errtext), Нет, exc_info [2])

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/mako_templating.py", строка 154, в вызове

result = template.render_unicode (** system)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/template.py", строка 311, в render_unicode

as_unicode = True)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py", строка 660, в _render

** _ kwargs_for_callable (callable_, data))

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py", строка 692, в _render_context

_exec_template (наследовать, lclcontext, args = args, kwargs = kwargs)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py", строка 718, в _exec_template

callable_ (context, * args, ** kwargs)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid_debugtoolbar-0.9.7-py2.6.egg/pyramid_debugtoolbar/panels/templates/headers.mako", строка 13, в render_body

$ {значение | ч}

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/MarkupSafe-0.15-py2.6.egg/markupsafe/_native.py", строка 21, в escape

возвращаемая разметка (юникод (ы)

MakoRenderingException:

Traceback (последний последний вызов):

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid-1.3a3-py2.6.egg/pyramid/mako_templating.py", строка 154, в call

result = template.render_unicode (** system)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/template.py", строка 311, в render_unicode

as_unicode = True)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py", строка 660, в _render

** _ kwargs_for_callable (callable_, data))

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py", строка 692, в _render_context

_exec_template (наследовать, lclcontext, args = args, kwargs = kwargs)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/Mako-0.5.0-py2.6.egg/mako/runtime.py", строка 718, в _exec_template

callable_ (context, * args, ** kwargs)

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/pyramid_debugtoolbar-0.9.7-py2.6.egg/pyramid_debugtoolbar/panels/templates/headers.mako", строка 13, в render_body

$ {значение | ч}

Файл "/home/ponomar/v/ENV/lib/python2.6/site-packages/MarkupSafe-0.15-py2.6.egg/markupsafe/_native.py", строка 21, в escape

возврат разметки (Unicode (s)

UnicodeDecodeError: Кодек 'ascii' не может декодировать байт 0xd0 в позиции 7: порядковый номер не в диапазоне (128)

1 Ответ

2 голосов
/ 17 января 2012

Кодирование преобразует строки Unicode в строки байтов.Вам нужно пойти в другом направлении: декодирование : request.POST['title'].decode('utf-8') (при условии, что request.POST['title'] - это кодировка UTF8 str).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...