Портал Python-программистов

Форумы сайта python.su

Вы не зашли.

Объявление

Официальная wiki коммунити: wiki.python.su обсуждение

Официальная джаббер конференция коммунити: pythonua@conference.jabber.ru (всегда 20-35 онлайн участников). Настройки

КОД ОБОРАЧИВАТЬ В ТЕГИ [code][/code]
  • > TurboGears
  • > что использовать SQLAlchemy или SQLobject для TurboGear? [RSS Feed]

#1 2008-08-12 11:23:28

qman
Питонер
Зарегистрирован: 2007-07-02
Сообщений: 404
Профиль

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

Всем привет,
Пишу веб  приложение для доступа данным к MS SQL сервера.
В доке на TurboGear чаще встречается SQLobject , поэтому взялся его изучать. Но столкнулся с проблемой
http://python.su/forum/viewtopic.php?id=2456.
Почитал форум увидел что преимущественно вопросы по SQLAlchemy , можно ли из этого сделать вывод что предпочтительнее использовать SQLAlchemy вместе с TurboGear?
Пока не искал ответ на возможность подключения к MS SQL из SQLAlchemy ?
Спасибо за любые советы.

Неактивен

 

#2 2008-08-12 12:41:47

pythonwin
Команда
Откуда: за компом
Зарегистрирован: 2006-07-18
Сообщений: 1293
Профиль

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

qman написал:

Но столкнулся с проблемой
http://python.su/forum/viewtopic.php?id=2456.

проблема не в sqlobject, а в том что что ты использовал простую строку с кириллицей, а нужно было указать что это тип unicode
p = Person(firstName=u'Вася', lastName=u'Пупкин', middleInitial="Q")
с MSSQL можно работать и с винды и линукса (debian) и нормально записывать буквы кириллицы.
насчет mssql и sqlalchemy, предлагаю тебе посмотреть ссылки
http://www.google.com/search?q=sqlalchemy+mssql
http://groups.google.com/group/sqlalche … 0febe02676
http://groups.google.com/group/sqlalche … 5d7c104681


...мир скучен для скучных людей. Сократ.
язык Python
framework TurboGears
форум по TurboGears

Неактивен

 

#3 2008-08-12 13:12:37

qman
Питонер
Зарегистрирован: 2007-07-02
Сообщений: 404
Профиль

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

pythonwin написал:

проблема не в sqlobject, а в том что что ты использовал простую строку с кириллицей, а нужно было указать что это тип unicode
p = Person(firstName=u'Вася', lastName=u'Пупкин', middleInitial="Q")

попробовал ваше решение

Код:

# -*- coding: utf-8 -*-
from sqlobject import *
class Person(SQLObject):
    firstName = StringCol()
    middleInitial = StringCol(length=1, default=None)
    lastName = StringCol()

sqlhub.processConnection = connectionForURI('mssql://sa:pass@127.0.0.1/sqlobject')
p = Person(firstName=u'Вася', lastName=u'Пупкин')

Данные содержащие символы кирилицы читаются в MS SQL Enterprise manager, но при работе программы появляется уже другая ошибка:

Код:

Traceback (most recent call last):
  File "C:\Documents and Settings\user\workspace\1\src\pack\sqlobject_example.py", line 16, in <module>
    p = Person(firstName=u'Вася', lastName=u'Пупкин')
  File "c:\python25\lib\site-packages\SQLObject-0.10.0-py2.5.egg\sqlobject\declarative.py", line 89, in _wrapper
    return fn(self, *args, **kwargs)
  File "c:\python25\lib\site-packages\SQLObject-0.10.0-py2.5.egg\sqlobject\main.py", line 1183, in __init__
    self._create(id, **kw)
  File "c:\python25\lib\site-packages\SQLObject-0.10.0-py2.5.egg\sqlobject\main.py", line 1217, in _create
    self.set(**kw)
  File "c:\python25\lib\site-packages\SQLObject-0.10.0-py2.5.egg\sqlobject\main.py", line 1058, in set
    kw[name] = dbValue = from_python(value, self._SO_validatorState)
  File "c:\python25\lib\site-packages\SQLObject-0.10.0-py2.5.egg\sqlobject\col.py", line 522, in from_python
    return value.encode("ascii")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)

что я делаю не так?
С уважением

Неактивен

 

#4 2008-08-12 14:11:52

PooH
Питонер
Откуда: Барнаул
Зарегистрирован: 2006-12-05
Сообщений: 804
Профиль

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

у меня смутное подозрение, что хотя вы и поставили вверху
# -*- coding: utf-8 -*-
но исходник у вас в cp1251, посмотрите настройки своего текстового редактора
или поставте вверху
# -*- coding: cp1251 -*-

Отредактированно PooH (2008-08-12 14:12:50)

Неактивен

 

#5 2008-08-12 15:13:18

qman
Питонер
Зарегистрирован: 2007-07-02
Сообщений: 404
Профиль

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

PooH написал:

у меня смутное подозрение, что хотя вы и поставили вверху
# -*- coding: utf-8 -*-
но исходник у вас в cp1251, посмотрите настройки своего текстового редактора
или поставте вверху
# -*- coding: cp1251 -*-

уже пробовал таким образом менять кодировку. использую easy eclipse for python. есть  мысли что проблема в adodbapi, т.к. попадалась рекомендация использовать pyodbc для подключения к MS SQL.

Неактивен

 

#6 2008-08-12 15:21:25

pythonwin
Команда
Откуда: за компом
Зарегистрирован: 2006-07-18
Сообщений: 1293
Профиль

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

попробуй пример:

Код:

import pymssql
con = pymssql.connect(host='192.168.0.1',user='user1',password=password, database='test1')
cur = con.cursor()
sql = unicode("insert people (first_name, last_name) values ('%s', '%s')", 'cp1251')
sql=sql%(unicode('Вася', 'cp1251'), unicode('Пупкин', 'cp1251'))
sql = sql.encode('cp1251')
cur.execute(sql)

скачать можно с http://pymssql.sourceforge.net/


...мир скучен для скучных людей. Сократ.
язык Python
framework TurboGears
форум по TurboGears

Неактивен

 

#7 2008-08-12 15:22:09

PooH
Питонер
Откуда: Барнаул
Зарегистрирован: 2006-12-05
Сообщений: 804
Профиль

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

Судя по трейсу исключения до работы с базой дело просто не доходит, он вылетает раньше. И ваши строки "Вася" и "Пупкин" явно в cp1251. Киньте мне на мыло исходник, я посмотрю.

Неактивен

 

#8 2008-08-13 07:14:52

qman
Питонер
Зарегистрирован: 2007-07-02
Сообщений: 404
Профиль

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

PooH

pythonwin написал:

попробуй пример:
Код:

import pymssql
con = pymssql.connect(host='192.168.0.1',user='user1',password=password, database='test1')
cur = con.cursor()
sql = unicode("insert people (first_name, last_name) values ('%s', '%s')", 'cp1251')
sql=sql%(unicode('Вася', 'cp1251'), unicode('Пупкин', 'cp1251'))
sql = sql.encode('cp1251')
cur.execute(sql)

скачать можно с http://pymssql.sourceforge.net/

сделал такой код

Код:

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

результат - ничего не добавляет и ничего не пишет про ошибки

Неактивен

 

#9 2008-08-13 10:48:33

qman
Питонер
Зарегистрирован: 2007-07-02
Сообщений: 404
Профиль

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

поставил pyodbc. следующий код (insert и select) великолепно работает:

Код:

# -*- coding: cp1251 -*-
import pyodbc
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;DATABASE=sqlobject;UID=sa;PWD=pass')
cursor = cnxn.cursor()
cursor.execute("select first_name, last_name from person")
sql = "INSERT INTO person (first_name, last_name) VALUES ('Вася', 'Пупкин')"
cursor.execute(sql)
cnxn.commit()
cursor.execute("select first_name, last_name from person")
for row in cursor:
    print row.first_name, row.last_name
print 'ok'

кто знает как использовать pyodbc из sqlobject? думаю все же отказаться от sqlobject и перейти на sqlalchemy

Неактивен

 

#10 2008-08-13 15:54:45

pythonwin
Команда
Откуда: за компом
Зарегистрирован: 2006-07-18
Сообщений: 1293
Профиль

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

qman написал:

кто знает как использовать pyodbc из sqlobject? думаю все же отказаться от sqlobject и перейти на sqlalchemy

http://groups.google.com/group/sqlalche … 5d7c104681

Код:

db = create_engine('mssql://user:pass@db', module=pymssql)

+ читать для ТГ+mssql+pyodbc+sqlalchemy
http://www.lucasmanual.com/mywiki/TurboGears
PS я использовал pymssql отдельно и pymssql+sqlobject и таких проблем у меня не было


...мир скучен для скучных людей. Сократ.
язык Python
framework TurboGears
форум по TurboGears

Неактивен

 

#11 2008-08-15 10:35:36

qman
Питонер
Зарегистрирован: 2007-07-02
Сообщений: 404
Профиль

Re: что использовать 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?

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

Отредактированно qman (2008-08-15 10:36:25)

Неактивен

 

#12 2008-08-20 19:18:33

qman
Питонер
Зарегистрирован: 2007-07-02
Сообщений: 404
Профиль

Re: что использовать 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

Всем спасибо за участие, странно что никто не предложил раньше установить кодировку таким образом.

Неактивен

 

#13 2009-07-14 16:00:01

Vermus
Питонер
Откуда: Россия, Липецк
Зарегистрирован: 2008-11-18
Сообщений: 29
Профиль  Вебсайт

Re: что использовать 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(), у меня заработало. (еще ";" в конце запроса)

Неактивен

 
  • > TurboGears
  • что использовать SQLAlchemy или SQLobject для TurboGear? [RSS Feed]

Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson

Board footer

Реклама: