Форумы сайта python.su
Вы не зашли.
И снова здравствуйте :-)
У меня два разнообразных вопроса теперь:
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 :-)
Неактивен
по первому вопросу завтра посмотрю, сходу сказать не могу. по поводу экспорта в 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)
Неактивен
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
Неактивен
hildi написал:
А почему СОМ лучше не использовать? У меня про него такой хороший учебник...
1. Теряем кросплатформенность
2. Теряем производительность - переход через границы процесса дорогая штука
3. Зависимость от установленной версии Excel
4. Хуже отлаживамся - здесь я могу полезть в исходники, в случае COM я буду медитировать над выкинутым исключением
И вообще чем проще подход - тем лучше работает ![]()
Неактивен
По первому вопросу: а зачем вам понадобилось явно создавать 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)Мне кажеться вы сами себя перехитрили ![]()
Неактивен
engine я создавала, чтобы включить ORM, у меня там существующие таблицы маппятся в классы. Это можно сделать и без engine?
я делала, как в учебнике написано :-)
Пусть пока лучше будет, так я хоть могу себе представить, как оно работает, а то вы такие ужасы пишете, а говорите, что просто :-)
Неактивен
hildi написал:
Пусть пока лучше будет, так я хоть могу себе представить, как оно работает, а то вы такие ужасы пишете, а говорите, что просто :-)
Угу, по-боцмански - безобразно, но однообразно ИЛИ человек - сам писец своего счастья ![]()
Дайте код мапинга, я покажу как сделать правильно, а то получается - кто играет семь бубен, то бывает у. хм... удивлен ![]()
Неактивен
Код у меня на работе, я завтра запощу. Там довольно мало букв, но я их наизусть не помню :-)
Вообще, то, что эта штука у меня вообще работает, я склонна рассматривать как чудо, так что бог с ней, пусть пока будет боцманская и безобразная, работает ведь :-)
У меня пока оч. мало опыта, и довольно мало времени, но я быстро учусь. Очень неудобно, что у меня в окружении нет ни одного умного питонщика. Один только есть, но у него мой уровень, он мне уже помочь не может :-(
Спасибо большое!
Неактивен
hildi написал:
Вообще, то, что эта штука у меня вообще работает, я склонна рассматривать как чудо, так что бог с ней, пусть пока будет боцманская и безобразная, работает ведь :-)
может в данном случае чтобы не "застрять" на этой вроде решённой проблеме и можно оставить как есть, но в будущем советую прислушаться к совету PooH, т.к. с выше описанными пунктами отрицательного использования COM можете столкнуться и учитывая вероятную сложность проекта потратите много времени на переход с COM
Неактивен
Вот я и добралась до работы :-)
Маппинг таблиц выглядит у меня вот так:
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)В закомментированной строчке неудавшаяся попытка сократить кол-во одновременных коннектов к базе.
Тут тоже все плохо?
Неактивен
честно говоря 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, и сессии по данным из конфига, вы же создаете лишние. Посмотрите выше я давал примеры для других случаев.
Неактивен
hildi написал:
А адрес, куда к базе подключаться, куда писать? *чеша в затылке*
а адрес у вас лежит в правильном месте, в файле конфигурации, в режиме отладки это файл dev.cfg
там есть строчка типа:
sqlalchemy.dburi="postgres://admin:123@localhost/rieltiko"
это он и есть
Неактивен
Не работает, ругается на отсутствие энжин:
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.
Неактивен
Спасибо :-)
Мне уже прямо неудобно становится, я так злоупотребляю... Даже не знаю, как вас благодарить :-)
Хотите пряников? Или, например, гифт-кард на амазон? Или чем я отсюда могу быть вам полезна?
Неактивен
Ответ есть на официальном сайте TG ![]()
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 посмотрите там еще много интересного
ЗЫ: никаких злоупотреблений, мне самому интересно - я не пробовал в ТГ таблицы с отображением из существующей базы, к тому же у нас праздники ![]()
Отредактированно PooH (2009-01-09 18:20:40)
Неактивен
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)
Неактивен