Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 15, 2007 15:27:54

webchemist
От:
Зарегистрирован: 2007-03-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

Друзья, спасите!
Решил делать очередной проект на Pylons (до этого в основном Django и собственный маленький фреймворк) + заодно SQLAlchemy - вроде уже пора как-бы. Категорически не могу добиться номального вывода строк из БД (MySQL). Кодировка везде - UTF-8. Все настройки по дефолту (для Pylons и SQLAlchemy - типа UTF-8 по документации). Вывожу строковые данные - получаю в выводе вопросики: где-то летит кодировка. Сперва грешил на Mako (новый для меня шаблонизатор), сделал вывод просто в поток (что то вроде string.join(, “ - ”) ), ситуация та же. Внутри SQLAlchemy, насколько я понимаю, - юникод, однако никакие попытки перекодировки не удались.
Может кто подскажет куда копать?



Офлайн

#2 Авг. 15, 2007 16:16:10

webchemist
От:
Зарегистрирован: 2007-03-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

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' []
Значит перекодирует, вопрос - как?



Офлайн

#3 Авг. 15, 2007 16:32:16

webchemist
От:
Зарегистрирован: 2007-03-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

Забыл добавить - проблема только с киррилическими символами. С латинскими все нормально.



Офлайн

#4 Авг. 15, 2007 17:06:51

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

на вход 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)

Офлайн

#5 Авг. 15, 2007 17:30:50

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

Если проблема с запросом - Pylons точно не при чем.
Алхимия прекрасно умеет работать с unicode. Только тип полей нужно менять со String на Unicode. И все.
Так что трудно подсказать сразу, где проблема.
Разве что если будет приведен маленький примерчик, на котором все и валится



Офлайн

#6 Авг. 15, 2007 17:33:06

webchemist
От:
Зарегистрирован: 2007-03-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

j2a
Спасибо за ответ. Скажите, а какой Вы используете ORM?

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



Офлайн

#7 Авг. 15, 2007 17:41:23

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????


# -*- 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,



Все отлично работает.
В чем отличие от твоего примера?



Офлайн

#8 Авг. 15, 2007 17:42:37

webchemist
От:
Зарегистрирован: 2007-03-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

Андрей Светлов
Могу не маленький, если это поможет…
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

Разве что если будет приведен маленький примерчик, на котором все и валится
Ничего не валиться, просто на какой-то стадии происходит неправильная перекодировка в результате которой теряются символы и выводятся вопросики.
Это горе.



Офлайн

#9 Авг. 15, 2007 17:44:57

webchemist
От:
Зарегистрирован: 2007-03-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

Отличия очевидны - объявлен тип поля Unicode.



Офлайн

#10 Авг. 15, 2007 17:46:07

webchemist
От:
Зарегистрирован: 2007-03-20
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

Изменил String на Unicode для поля name. Создал записи из кода путем добавления юникодных строк. В базе хранятся значения типа &#208;”&#208;°
Ну положим, так все работает.
Но неужели нельзя, чтобы в базе хранились UTF-8 строки, а Алхимия их корректно перекодировала? Ведь так очень неудобно - мало того что нельзя посмотреть значения (например, в PhpMyAdmin), так и появляется проблема добавления из других источников, которые о юникоде ничего не знают…



Отредактировано (Авг. 15, 2007 17:56:07)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version