Уведомления

Группа в Telegram: @pythonsu

#1 Март 31, 2008 15:03:21

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy mapping. вычисляемые поля

всем привет. столкнулся с проблемой создания вычисляемых полей. у меня должен быть объект таблицы с двумя вычисляемыми полями (данные берутся из других таблиц). я делаю так

class User(object):
    pass
mapping(User, user_table)
и не могу понять как вставить вычисляемые поля. вроде это через mapping делается…просматривал доки к sqlalchemy, но ничего не смог высмотреть. кто может сталкивался с подобным? или доки путевые подскажите, желательно на русском)



Офлайн

#2 Март 31, 2008 15:12:13

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlalchemy mapping. вычисляемые поля

http://www.sqlalchemy.org/docs/04/mappers.html#advdatamapping_mapper_expressions

P.S. А в чем проблема сделать это в классе User? Как classmethod/staticmethod/property?



Офлайн

#3 Апрель 1, 2008 08:20:02

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy mapping. вычисляемые поля

j2a спасибо за ссылочку, будем читать) в моих доках такого не было(



Офлайн

#4 Апрель 1, 2008 11:29:32

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlalchemy mapping. вычисляемые поля

hellslade, тогда бы неплохо показать какая версия SA у тебя. У меня:

>>> import sqlalchemy
>>> sqlalchemy.__version__
'0.4.4'



Офлайн

#5 Апрель 1, 2008 18:39:45

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy mapping. вычисляемые поля

j2a у меня 0.4.2b, на работе так стоит…попробую обновить, но думаю и на этой версии все должно работать :)
кстати если создать метод в классе User, потом к нему обращаться через session.select(User).method ?(у меня все через сессию..довольно большой корпоративный проект:) ) я новичок в этом..хотелось освоить, библиотека вроде здравая))



Офлайн

#6 Апрель 1, 2008 19:44:59

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlalchemy mapping. вычисляемые поля

А, не, всё ок. Это просто убедиться, что у тебя 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)

Офлайн

#7 Апрель 2, 2008 07:28:46

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy mapping. вычисляемые поля

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()
как описанное свойство на это влияет не могу понять(



Офлайн

#8 Апрель 2, 2008 10:33:48

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlalchemy mapping. вычисляемые поля

hellslade
j2a
если через sa.Table описывать колонки, то как я понимаю, они должны существовать в таблице. у меня же их в таблице нет и не должно быть, мне их вычислить надо при обращении…
Смотри. Через sa.Table ты задаешь таблицу. А потом эту таблицу маппишь к классу. И ты хочешь чтобы у экземпляра этого класса был атрибут, вычисляемый из данных таблицы. Я привел тебе пример метода класса, вычисляемый из данных таблицы. Абсолютно по аналогии ты и действуешь – создаешь метод-геттер и через декоратор property его назначаешь атрибутом. Можно создавать нужный тебе атрибут на этапе маппинга - это пример из доки.


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"))})
Будь внимательней. В доке и в моем примере запрос, обслуживающий данное свойство, строится на таблицах, а не на mapped-объектах. Т.е. не Job.c.id, а job_table.c.id.



Офлайн

#9 Апрель 2, 2008 10:45:35

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy mapping. вычисляемые поля

j2a
спасибо за помощь, разобрался вроде с этим…по крайней мере все заработало)) я прописал свойства в классе



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version