Найти - Пользователи
Полная версия: Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????
Начало » Pyramid / Pylons / TurboGears » Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????
1 2 3
webchemist
Друзья, спасите!
Решил делать очередной проект на Pylons (до этого в основном Django и собственный маленький фреймворк) + заодно SQLAlchemy - вроде уже пора как-бы. Категорически не могу добиться номального вывода строк из БД (MySQL). Кодировка везде - UTF-8. Все настройки по дефолту (для Pylons и SQLAlchemy - типа UTF-8 по документации). Вывожу строковые данные - получаю в выводе вопросики: где-то летит кодировка. Сперва грешил на Mako (новый для меня шаблонизатор), сделал вывод просто в поток (что то вроде string.join(, “ - ”) ), ситуация та же. Внутри SQLAlchemy, насколько я понимаю, - юникод, однако никакие попытки перекодировки не удались.
Может кто подскажет куда копать?
webchemist
C SQlite вообще забавно получилось:
<class 'sqlalchemy.exceptions.SQLError'>: (OperationalError) Could not decode to UTF-8 column 'people_name' with text '&#556;?'SELECT people.email AS people_email, people.id AS people_id, people.name AS people_name FROM people ORDER BY people.oid' []
Значит перекодирует, вопрос - как?
webchemist
Забыл добавить - проблема только с киррилическими символами. С латинскими все нормально.
j2a
на вход Mako нужно подавать юникод

#!/usr/bin/python
# -*- encoding: utf-8 -*-

from mako.lookup import TemplateLookup

lkp = TemplateLookup(directories=, output_encoding='utf-8')

tmpl = lkp.get_template(“template.mak”)

print tmpl.render(name=u“Mike”)
print tmpl.render(name=u“Майк”)

# encoding: utf-8
Mako template example:
Hello, ${name or 'world'}!
Андрей Светлов
Если проблема с запросом - Pylons точно не при чем.
Алхимия прекрасно умеет работать с unicode. Только тип полей нужно менять со String на Unicode. И все.
Так что трудно подсказать сразу, где проблема.
Разве что если будет приведен маленький примерчик, на котором все и валится
webchemist
j2a
Спасибо за ответ. Скажите, а какой Вы используете ORM?

Но дело, на сколько я понимаю, не в Мако. Я быстро накропал маленький скрипт - просто подключение SQLAlchemy и вывод результата, чтобы исключить возможные перекодировки в Pylons (а они там есть кстати?). Результат тот же - вместо русских слов - вопросики. Т.е. проблема в SQLAlchemy (?). Как с этим бороться? Неужели никто не использует Алхимию?
Я ж особо не выпендривался - взял туторилов пару и тупо воспроизвел. Кодировка везде указана верная, менял настройки encoding, convert_unicode - результат нулевой
Андрей Светлов

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

from sqlalchemy import *
from sqlalchemy.orm import *
import datetime

engine = create_engine(“sqlite:///”)

metadata = MetaData()

users = Table('users', metadata,
Column('user_id', Integer, primary_key=True),
Column('username', Unicode(40), unique=True),
Column('password', String(32)),
Column('email', String(25)))


metadata.create_all(engine)

class User(object):
def __init__(self, name, passwd, email):
self.username = name
self.password = passwd
self.email = email

def __repr__(self):
return ‘User %s’%self.username


mapper(User, users)

Session = sessionmaker(bind=engine, transactional=True)

session = Session()
u = User(u'Андрей', ‘pass’, ‘john@company.com’)
session.save(u)
session.flush()

session.commit()
session.clear()

u = session.query(User).filter(User.id==1).one()

print type(u.username)
print u.user_id, u.username,



Все отлично работает.
В чем отличие от твоего примера?
webchemist
Андрей Светлов
Могу не маленький, если это поможет…
1) Модель данных - используется SQLAlchemy 0.3.10 и последняя версия sacontext
Код: :python:
import sqlalchemy as sqla
from sqlalchemy.orm import mapper
from netsales.lib.sacontext import PylonsSAContext

sac = PylonsSAContext()
sac.add_engine_from_config(None)

people_table = sqla.Table('people', sac.metadata,
sqla.Column('id', sqla.Integer, primary_key=True),
sqla.Column('name', sqla.String(100)),
sqla.Column('email', sqla.String(100))
)

addresses_people_table = sqla.Table('addresses_people', sac.metadata,
sqla.Column('id', sqla.Integer, primary_key=True),
sqla.Column('person_id', sqla.Integer, sqla.ForeignKey('people.id')),
sqla.Column('address_id', sqla.Integer, sqla.ForeignKey('addresses.id'))
)

addresses_table = sqla.Table('addresses', sac.metadata,
sqla.Column('id', sqla.Integer, primary_key=True),
sqla.Column('address', sqla.String(100))
)

class Person(object):
pass
class Address(object):
pass

mapper(Address, addresses_table, extension=sac.ext)

mapper(Person, people_table, properties = {
'my_addresses' : sqla.relation(Address, secondary = addresses_people_table),
},
extension=sac.ext)
2) Настройки:
sqlalchemy.default.uri = mysql://root@localhost/netsales_dev
sqlalchemy.default.pool_recycle = 3600
sqlalchemy.default.convert_unicode = True
sqlalchemy.default.encoding='utf-8'
3) Контроллер:
Код: :python:

# -*- coding: UTF-8 -*-
from netsales.lib.base import *
from netsales.model import *
import string

class HomepageController(BaseController):
def index(self):
c.ps = sac.query(Person)
c.title = u'Индекс'
return render_response('homepage/index.html');
#
Ну шаблон приводить не буду - просто цикл с выводом поля name

Разве что если будет приведен маленький примерчик, на котором все и валится
Ничего не валиться, просто на какой-то стадии происходит неправильная перекодировка в результате которой теряются символы и выводятся вопросики.
Это горе.
webchemist
Отличия очевидны - объявлен тип поля Unicode.
webchemist
Изменил String на Unicode для поля name. Создал записи из кода путем добавления юникодных строк. В базе хранятся значения типа &#208;”&#208;°
Ну положим, так все работает.
Но неужели нельзя, чтобы в базе хранились UTF-8 строки, а Алхимия их корректно перекодировала? Ведь так очень неудобно - мало того что нельзя посмотреть значения (например, в PhpMyAdmin), так и появляется проблема добавления из других источников, которые о юникоде ничего не знают…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB