Форум сайта python.su
Друзья, спасите!
Решил делать очередной проект на Pylons (до этого в основном Django и собственный маленький фреймворк) + заодно SQLAlchemy - вроде уже пора как-бы. Категорически не могу добиться номального вывода строк из БД (MySQL). Кодировка везде - UTF-8. Все настройки по дефолту (для Pylons и SQLAlchemy - типа UTF-8 по документации). Вывожу строковые данные - получаю в выводе вопросики: где-то летит кодировка. Сперва грешил на Mako (новый для меня шаблонизатор), сделал вывод просто в поток (что то вроде string.join(, “ - ”) ), ситуация та же. Внутри SQLAlchemy, насколько я понимаю, - юникод, однако никакие попытки перекодировки не удались.
Может кто подскажет куда копать?
Офлайн
C SQlite вообще забавно получилось:
<class 'sqlalchemy.exceptions.SQLError'>: (OperationalError) Could not decode to UTF-8 column 'people_name' with text 'Ȭ?'SELECT people.email AS people_email, people.id AS people_id, people.name AS people_name FROM people ORDER BY people.oid' []
Офлайн
Забыл добавить - проблема только с киррилическими символами. С латинскими все нормально.
Офлайн
на вход 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'}!
Отредактировано (Авг. 15, 2007 17:11:57)
Офлайн
Если проблема с запросом - Pylons точно не при чем.
Алхимия прекрасно умеет работать с unicode. Только тип полей нужно менять со String на Unicode. И все.
Так что трудно подсказать сразу, где проблема.
Разве что если будет приведен маленький примерчик, на котором все и валится
Офлайн
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,
Все отлично работает.
В чем отличие от твоего примера?
Офлайн
Андрей Светлов
Могу не маленький, если это поможет…
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)
Код: :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');
#
Офлайн
Отличия очевидны - объявлен тип поля Unicode.
Офлайн
Изменил String на Unicode для поля name. Создал записи из кода путем добавления юникодных строк. В базе хранятся значения типа Да
Ну положим, так все работает.
Но неужели нельзя, чтобы в базе хранились UTF-8 строки, а Алхимия их корректно перекодировала? Ведь так очень неудобно - мало того что нельзя посмотреть значения (например, в PhpMyAdmin), так и появляется проблема добавления из других источников, которые о юникоде ничего не знают…
Отредактировано (Авг. 15, 2007 17:56:07)
Офлайн