Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 15, 2008 09:35:36

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

что использовать SQLAlchemy или SQLobject для TurboGear?

используется sqlobject 1.0
файл “c:\python25\lib\site-packages\SQLObject-0.10.0-py2.5.egg\sqlobject\col.py”, line 513,

class StringValidator(validators.Validator):

def to_python(self, value, state):
if value is None:
return None
if isinstance(value, unicode):
connection = state.soObject._connection
dbEncoding = getattr(connection, "dbEncoding", None) or "ascii"
return value.encode(dbEncoding)
return value

def from_python(self, value, state):
if value is None:
return None
if isinstance(value, str):
return value
if isinstance(value, unicode):
return value.encode("ascii")
return value
если в строчках заменить ascii на cp1251 то успешно проходит вставка данных в cp1251 и в unicode.
Но наверно правильнее указать свою кодировку через свойство dbEncoding?
как правильно использовать dbEncoding?
попробовал так
Person.dbEncoding = 'cp1251'
Person это таблица, присваивание ошибок не выходит , но все все равно желает работать только с ascii!!!
Непонятно как должен работать код
        if isinstance(value, unicode):
return value.encode("ascii")
потому как если значение есть юникод то почему автор этих строк считает что любой символ юникода имеет соотвествующий в таблице ascii?

Спасибо всем дочитавшим до конца



Отредактировано (Авг. 15, 2008 09:36:25)

Офлайн

#2 Авг. 20, 2008 18:18:33

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

что использовать SQLAlchemy или SQLobject для TurboGear?

Как установить dbEncoding класса StringValidator в составе SQLObject?
чтобы сделать сделать добавление (insert) данных содержащих символы кириллицы пришлось заменить

dbEncoding = getattr(connection, "dbEncoding", None) or "ascii"
на
dbEncoding = 'cp1251'
после этого класс StringValidator имеет следующий вид:
class StringValidator(validators.Validator):

def to_python(self, value, state):
if value is None:
return None
if isinstance(value, unicode):
connection = state.soObject._connection
dbEncoding = getattr(connection, "dbEncoding", None) or "ascii"
dbEncoding = 'cp1251'
print "dbEncoding = %s"%dbEncoding
return value.encode(dbEncoding)
return value
но оказалось это не самое правильное решение, логичнее установить dbEncoding = ‘cp1251’ класса
StringValidator в составе SQLObject!!!
для этого в основной программе
sqlhub.processConnection.dbEncoding = 'cp1251'# MS SQL хранит данные в кодировке cp1251
Всем спасибо за участие, странно что никто не предложил раньше установить кодировку таким образом.



Офлайн

#3 Июль 14, 2009 15:00:01

Vermus
От:
Зарегистрирован: 2008-11-18
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

что использовать SQLAlchemy или SQLobject для TurboGear?

qman
сделал такой код
# -*- coding: cp1251 -*-
import pymssql
con = pymssql.connect(host='127.0.0.1',user='sa',password='pass', database='sqlobject')
cur = con.cursor()
sql = unicode("insert person (first_name, last_name) values ('%s', '%s')", 'cp1251')
sql = sql%(unicode('Вася', 'cp1251'), unicode('Пупкин', 'cp1251'))
sql = sql.encode('cp1251')
cur.execute(sql)
результат - ничего не добавляет и ничего не пишет про ошибки
я добавил con.commit(), у меня заработало. (еще “;” в конце запроса)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version