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

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

Вы не зашли.

Объявление

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

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

КОД ОБОРАЧИВАТЬ В ТЕГИ [code][/code]
  • > TurboGears
  • > TG+SA: connection pool и экспорт в excel - как сделать "красиво"? [RSS Feed]

#1 2009-01-07 19:09:12

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

И снова здравствуйте :-)

У меня два разнообразных вопроса теперь:

1. Т. к. ТГ при каждом рестарте плодит по коннекшну, не убивая предыдущие, я попыталась это дело победить как-то так:

Код:

from sqlalchemy import *

engine = create_engine("postgres://stat_admin:password@172.0.0.0:5433/gf_cfv?pool=2&pool_recycle=300")

или так:

Код:

from sqlalchemy import *

engine = create_engine("postgres://stat_admin:password@172.0.0.0:5433/gf_cfv", connect_args=dict(pool=2, pool_recycle=300))

... и получаю следующее:

sqlalchemy.exc.DBAPIError: (TypeError) 'pool_recycle' is an invalid keyword argument for this function None None

Как это правильно сделать, чтобы ограничить число одновременных коннекшнов к базе?


И второй вопрос:

Пытаюсь прикрутить вывод статистики в эксель. Я когда-то написала простенький парсер с таким экспортом, и решила скопипейстить оттуда код в ТГ. Вот так он примерно выглядит:

Код:

from win32com.client import Dispatch
import datetime
    @expose
    def graph2xl(self):
        sheetName = 'H:\\team-ne\\team_ne\\templates\\report.xls'
        xlApp = Dispatch("Excel.Application")
        reportBook = xlApp.Workbooks.Open(sheetName)
        #xlApp.Visible = 1
        row = 6
        try:
            for k in finance_report: #<--- глобальная переменная со словарем с данными, определяется в другой функции.
                reportBook.ActiveSheet.Cells(row, 1).Value = k.anbieter
                reportBook.ActiveSheet.Cells(row, 10).Value = year_from #<--- глобальная переменная, определяется в другой функции.
                reportBook.ActiveSheet.Cells(row, 22).Value = year_from+1
                row += 6
        finally:
                reportBook.SaveAs("H:\\team-ne\\team_ne\\berichte\\"+time.strftime('%d-%m-%y_%H-%M-%S')+".xls")
                xlApp.Quit()
        return str("hallo welt")#<---- не совсем понятно, что тут вообще писать в этом случае, и надо ли оно ваще тут?

И оно не работает, говорит что:

  File "c:\Python25\lib\inspect.py", line 742, in getargspec
    raise TypeError('arg is not a Python function')
TypeError: arg is not a Python function

Что это оно мне пишет? На что ругается?

Это кошмар какой-то.

Традиционное гигантское спасибо in advance :-)

Неактивен

 

#2 2009-01-07 20:50:50

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

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

по первому вопросу завтра посмотрю, сходу сказать не могу. по поводу экспорта в excel, дайте начало трайсбека, не понятно на какую строчку он ругается, а еще лучше не используйте COM, а используйте библиотеку pyExcelerator, работать будет куда быстрее и избежите кучи непонятных проблем, вот вам маленький пример:

Код:

    @expose()                                                                                                                
    def awalance_report(self, kind=0, code=0, dateChange=None):  
        #здесь формируется выборка, я выкинул как неинтересное
        import pyExcelerator as ex                                                                                           
        import cStringIO as StringIO                                                                                                      
                                                                                                                             
        w = ex.Workbook()                                                                                                    
        sheet = w.add_sheet(u'Льготники')                                                                                       
        ex.UnicodeUtils.DEFAULT_ENCODING = 'cp1251' #кодировка документа, вам наверно не понадобится 

        for row, obj in enumerate(query):                                                                                                       
             sheet.write(row, 1, obj.subject.lastName)                                                            
             sheet.write(row, 2, obj.subject.firstName)                                                           
             sheet.write(row, 3, obj.subject.middleName or '')                                                    
             sheet.write(row, 4, formatDate(obj.subject.birthDate))                                               
             sheet.write(row, 5, obj.subject.inn or '')      

        ofile = StringIO.StringIO()                                                                                          
        w.save(ofile)                                                                                                        
        result = ofile.getvalue()                                                                                            
        ofile.close()  
        #устанавливаем правильный MIME-тип         
        cherrypy.response.headers["Content-Type"] = "application/vnd.ms-excel"                                               
        cherrypy.response.headers['Content-Disposition'] = 'attachment; filename=result.xls'                                 
        return result

Отредактированно PooH (2009-01-07 20:54:27)

Неактивен

 

#3 2009-01-08 08:34:22

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

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

PooH написал:

cherrypy.response.headers["Content-Type"] = "application/vnd.ms-excel"

согласно документации от w3c вариант "application/vnd.ms-excel" более правильный чем

Код:

cherrypy.response.headers['Content-Type'] = "application/ms-excel"

хотя использую второй способ и он тоже работает

http://www.w3.org/Library/src/HTBInit.c
http://www.w3.org/People/mimasa/test/xh … pe8.0.2-IE
PooH, +1


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

Неактивен

 

#4 2009-01-08 10:11:33

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

Спасибо огромное!
Я на работу только завтра пойду, буду пробовать.

А почему СОМ лучше не использовать? У меня про него такой хороший учебник...

Неактивен

 

#5 2009-01-08 12:16:26

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

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

hildi написал:

А почему СОМ лучше не использовать? У меня про него такой хороший учебник...

1. Теряем кросплатформенность
2. Теряем производительность - переход через границы процесса дорогая штука
3. Зависимость от установленной версии Excel
4. Хуже отлаживамся - здесь я могу  полезть в исходники, в случае COM я буду медитировать над выкинутым исключением

И вообще чем проще подход - тем лучше работает smile

Неактивен

 

#6 2009-01-08 12:54:38

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

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

По первому вопросу: а зачем вам понадобилось явно создавать engine? ТГ с ней сам прекрасно работает
в методах контроллера:

Код:

from turbogears.database import session
offers = session.query(model.Offer).filter(model.Offer.contact == manager)

в файлах модели

Код:

from turbogears.database import metadata

visits_table = Table('visit', metadata,                                                                                                                      
    Column('visit_key', String(40), primary_key=True),                                                                                                       
    Column('created', DateTime, nullable=False, default=datetime.now),                                                                                       
    Column('expiry', DateTime)                                                                                                                               
)

в методах объектов модели

Код:

from sqlalchemy.orm import object_session

class BuildingComplex(Building):                                                                                                                             
    u"Комплекс зданий"                                                                                                                                       

    def _get_construction_count(self):                                                                                                                       
        return object_session(self).query(Realty).filter(and_(realty_table.c.complex_id == self.id,                                                          
            realty_table.c.type == 'construction')).count()                                                                                                  
    construction_count = property(_get_construction_count)

Мне кажеться вы сами себя перехитрили wink

Неактивен

 

#7 2009-01-08 15:07:58

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

engine я создавала, чтобы включить ORM, у меня там существующие таблицы маппятся в классы. Это можно сделать и без engine?
я делала, как в учебнике написано :-)

Пусть пока лучше будет, так я хоть могу себе представить, как оно работает, а то вы такие ужасы пишете, а говорите, что просто :-)

Неактивен

 

#8 2009-01-08 15:15:39

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

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

hildi написал:

Пусть пока лучше будет, так я хоть могу себе представить, как оно работает, а то вы такие ужасы пишете, а говорите, что просто :-)

Угу, по-боцмански - безобразно, но однообразно ИЛИ человек - сам писец своего счастья smile
Дайте код мапинга, я покажу как сделать правильно, а то получается - кто играет семь бубен, то бывает у. хм... удивлен smile

Неактивен

 

#9 2009-01-08 15:49:53

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

Код у меня на работе, я завтра запощу. Там довольно мало букв, но я их наизусть не помню :-)
Вообще, то, что эта штука у меня вообще работает, я склонна рассматривать как чудо, так что бог с ней, пусть пока будет боцманская и безобразная, работает ведь :-)
У меня пока оч. мало опыта, и довольно мало времени, но я быстро учусь. Очень неудобно, что у меня в окружении нет ни одного умного питонщика. Один только есть, но у него мой уровень, он мне уже помочь не может :-(

Спасибо большое!

Неактивен

 

#10 2009-01-09 13:41:42

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

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

hildi написал:

Вообще, то, что эта штука у меня вообще работает, я склонна рассматривать как чудо, так что бог с ней, пусть пока будет боцманская и безобразная, работает ведь :-)

может в данном случае чтобы не "застрять" на этой вроде решённой проблеме и можно оставить как есть, но в будущем советую прислушаться к совету PooH, т.к. с выше описанными  пунктами отрицательного использования COM можете столкнуться и учитывая вероятную сложность проекта потратите много времени на переход с COM


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

Неактивен

 

#11 2009-01-09 16:26:39

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

Вот я и добралась до работы :-)

Маппинг таблиц выглядит у меня вот так:

Код:

from sqlalchemy import *
from sqlalchemy.orm import *

#engine = create_engine("postgres://stat_admin:blabla@172.0.0.0:5433/gf_cfv?pool=2&pool_recycle=300")
engine = create_engine("postgres://stat_admin:blabla@172.0.0.0:5433/gf_cfv")
meta = MetaData("postgres://stat_admin:blabla@172.0.0.0:5433/gf_cfv")
meta.reflect(bind = engine, schema = "public")

item = Table('team_ne', meta, autoload = True, autoload_with = engine)
listen = Table('listen', meta, autoload = True, autoload_with = engine)

class Item(object): pass
class Listen(object): pass

mapper(Item, item)
mapper(Listen, listen)

В закомментированной строчке неудавшаяся попытка сократить кол-во одновременных коннектов к базе.
Тут тоже все плохо?

Неактивен

 

#12 2009-01-09 17:24:07

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

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

честно говоря autoload для таблиц не пробовал, но так должно работать

Код:

from turbogears.database import metadata, _engine

item = Table('team_ne', metadata, autoload = True, autoload_with = _engine)
listen = Table('listen', metadata, autoload = True, autoload_with = _engine)

class Item(object): pass
class Listen(object): pass

mapper(Item, item)
mapper(Listen, listen)

Дело в том что TG сам создает для вас и engine, и сессии по данным из конфига, вы же создаете лишние. Посмотрите выше я давал примеры для других случаев.

Неактивен

 

#13 2009-01-09 17:41:20

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

А адрес, куда к базе подключаться, куда писать? *чеша в затылке*

Неактивен

 

#14 2009-01-09 17:48:59

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

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

hildi написал:

А адрес, куда к базе подключаться, куда писать? *чеша в затылке*

а адрес у вас лежит в правильном месте, в файле конфигурации, в режиме отладки это файл dev.cfg
там есть строчка типа:
sqlalchemy.dburi="postgres://admin:123@localhost/rieltiko"
это он и есть

Неактивен

 

#15 2009-01-09 17:58:20

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

Не работает, ругается на отсутствие энжин:


H:\team-ne>python start-team_ne.py
Traceback (most recent call last):
  File "start-team_ne.py", line 15, in <module>
    start()
  File "H:\team-ne\team_ne\commands.py", line 51, in start
    from team_ne.controllers import Root
  File "H:\team-ne\team_ne\controllers.py", line 9, in <module>
    from model import Item, Listen
  File "H:\team-ne\team_ne\model.py", line 16, in <module>
    item = Table('team_ne', metadata, autoload = True, autoload_with = _engine)
  File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\schema.py", line 113,
in __call__
    return type.__call__(self, name, metadata, *args, **kwargs)
  File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\schema.py", line 242,
in __init__
    _bind_or_error(metadata).reflecttable(self, include_columns=include_columns)
  File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\schema.py", line 2054
, in _bind_or_error
    raise exc.UnboundExecutionError(msg)
sqlalchemy.exc.UnboundExecutionError: The MetaData is not bound to an Engine or Connection.  Executi
on can not proceed without a database to execute against.  Either execute with an explicit connectio
n or assign the MetaData's .bind to enable implicit execution.

Неактивен

 

#16 2009-01-09 18:06:37

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

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

Да, действительно, в  момент импорта модуля metadata еще не с биндина с engin. Сейчас покопаю дальше

Неактивен

 

#17 2009-01-09 18:13:44

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

Спасибо :-)
Мне уже прямо неудобно становится, я так злоупотребляю... Даже не знаю, как вас благодарить :-)
Хотите пряников? Или, например, гифт-кард на амазон? Или чем я отсюда могу быть вам полезна?

Неактивен

 

#18 2009-01-09 18:13:59

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

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

Ответ есть на официальном сайте TG smile

Код:

from turbogears.database import metadata, bind_meta_data
bind_meta_data()

item = Table('team_ne', metadata, autoload = True)
listen = Table('listen', metadata, autoload = True)

class Item(object): pass
class Listen(object): pass

mapper(Item, item)
mapper(Listen, listen)

там же, кстати, есть как указать параметры пула
sqlalchemy.pool_recycle = 30
в файле конфигурации
http://docs.turbogears.org/1.0/SQLAlchemy посмотрите там еще много интересного

ЗЫ: никаких злоупотреблений, мне самому интересно - я не пробовал в ТГ таблицы с отображением из существующей базы, к тому же у нас праздники smile

Отредактированно PooH (2009-01-09 18:20:40)

Неактивен

 

#19 2009-02-16 19:16:16

saabeilin
Питонер
Откуда: Самара
Зарегистрирован: 2009-02-14
Сообщений: 8
Профиль

Re: TG+SA: connection pool и экспорт в excel - как сделать "красиво"?

PooH написал:

Код:

        w.save(ofile)

У меня, кстати, не работает. Утверждает, что, мол,

File '/home/[...]/controllers/reports.py', line 31 in excel
  w.save(ofile)
File 'build/bdist.linux-x86_64/egg/pyExcelerator/Workbook.py', line 547 in save
File 'build/bdist.linux-x86_64/egg/pyExcelerator/CompoundDoc.py', line 532 in save
TypeError: coercing to Unicode: need string or buffer, cStringIO.StringO found

pyExcelerator сначала был "просто_установленный", потом из svn trunk'а, результат один. Кстати, и со StringIO не работает.

UPDATE: отбой, замена на xlwt помогла, все отлично работает.

Отредактированно saabeilin (2009-02-16 19:48:29)

Неактивен

 
  • > TurboGears
  • TG+SA: connection pool и экспорт в excel - как сделать "красиво"? [RSS Feed]

Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson

Board footer

Реклама: