Форум сайта python.su
всем привет. столкнулся с проблемой создания вычисляемых полей. у меня должен быть объект таблицы с двумя вычисляемыми полями (данные берутся из других таблиц). я делаю так
class User(object): pass mapping(User, user_table)
Офлайн
http://www.sqlalchemy.org/docs/04/mappers.html#advdatamapping_mapper_expressions
P.S. А в чем проблема сделать это в классе User? Как classmethod/staticmethod/property?
Офлайн
j2a спасибо за ссылочку, будем читать) в моих доках такого не было(
Офлайн
hellslade, тогда бы неплохо показать какая версия SA у тебя. У меня:
>>> import sqlalchemy
>>> sqlalchemy.__version__
'0.4.4'
Офлайн
j2a у меня 0.4.2b, на работе так стоит…попробую обновить, но думаю и на этой версии все должно работать :)
кстати если создать метод в классе User, потом к нему обращаться через session.select(User).method ?(у меня все через сессию..довольно большой корпоративный проект:) ) я новичок в этом..хотелось освоить, библиотека вроде здравая))
Офлайн
А, не, всё ок. Это просто убедиться, что у тебя 0.4, а не 0.3 :)
Я делаю примерно так:
# импорты, объявление engine, объявление session (scoped session), metadata
# …
metainfo_table = sa.Table('metainfo', metadata,
sa.Column('key', sa.String(50), primary_key=True, unique=True, index=True),
sa.Column('value', sa.Unicode(255)),
)
class MetaInfo(object):
_info = None
def __init__(self, key, value):
self.key = key
self.value = value
@classmethod
def get(cls, key):
if getattr(cls, ‘_info’, None) is None:
s = sa.select()
cls._info = dict(session.execute(s).fetchall())
return cls._info.get(key)
########
updated_at = MetaInfo.get('updated_at')
Отредактировано (Апрель 1, 2008 19:45:25)
Офлайн
j2a
если через sa.Table описывать колонки, то как я понимаю, они должны существовать в таблице. у меня же их в таблице нет и не должно быть, мне их вычислить надо при обращении…я вот так написал в соответствии с
j2a
http://www.sqlalchemy.org/docs/04/mappe … xpressions
mapper(User,user_table,properties={'job_count':column_property( select( [func.count(Job.c.done100)], and_(Job.c.id==Appointment.c.job_id,Job.c.done100==0) ).group_by(Appointment.c.user_id).label("job_count"))})
self.myid = self.session.query(User).filter(User.c.login==config.login).one().id
raise exceptions.InvalidRequestError: No rows returned for one()
Офлайн
hellsladeСмотри. Через sa.Table ты задаешь таблицу. А потом эту таблицу маппишь к классу. И ты хочешь чтобы у экземпляра этого класса был атрибут, вычисляемый из данных таблицы. Я привел тебе пример метода класса, вычисляемый из данных таблицы. Абсолютно по аналогии ты и действуешь – создаешь метод-геттер и через декоратор property его назначаешь атрибутом. Можно создавать нужный тебе атрибут на этапе маппинга - это пример из доки.
j2a
если через sa.Table описывать колонки, то как я понимаю, они должны существовать в таблице. у меня же их в таблице нет и не должно быть, мне их вычислить надо при обращении…
Будь внимательней. В доке и в моем примере запрос, обслуживающий данное свойство, строится на таблицах, а не на mapped-объектах. Т.е. не Job.c.id, а job_table.c.id.mapper(User,user_table,properties={'job_count':column_property( select( [func.count(Job.c.done100)], and_(Job.c.id==Appointment.c.job_id,Job.c.done100==0) ).group_by(Appointment.c.user_id).label("job_count"))})
Офлайн
j2a
спасибо за помощь, разобрался вроде с этим…по крайней мере все заработало)) я прописал свойства в классе
Офлайн