Найти - Пользователи
Полная версия: sqlalchemy mapping. вычисляемые поля
Начало » Базы данных » sqlalchemy mapping. вычисляемые поля
1
hellslade
всем привет. столкнулся с проблемой создания вычисляемых полей. у меня должен быть объект таблицы с двумя вычисляемыми полями (данные берутся из других таблиц). я делаю так
class User(object):
    pass
mapping(User, user_table)
и не могу понять как вставить вычисляемые поля. вроде это через mapping делается…просматривал доки к sqlalchemy, но ничего не смог высмотреть. кто может сталкивался с подобным? или доки путевые подскажите, желательно на русском)
j2a
http://www.sqlalchemy.org/docs/04/mappers.html#advdatamapping_mapper_expressions

P.S. А в чем проблема сделать это в классе User? Как classmethod/staticmethod/property?
hellslade
j2a спасибо за ссылочку, будем читать) в моих доках такого не было(
j2a
hellslade, тогда бы неплохо показать какая версия SA у тебя. У меня:

>>> import sqlalchemy
>>> sqlalchemy.__version__
'0.4.4'
hellslade
j2a у меня 0.4.2b, на работе так стоит…попробую обновить, но думаю и на этой версии все должно работать :)
кстати если создать метод в классе User, потом к нему обращаться через session.select(User).method ?(у меня все через сессию..довольно большой корпоративный проект:) ) я новичок в этом..хотелось освоить, библиотека вроде здравая))
j2a
А, не, всё ок. Это просто убедиться, что у тебя 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')

hellslade
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()
как описанное свойство на это влияет не могу понять(
j2a
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.
hellslade
j2a
спасибо за помощь, разобрался вроде с этим…по крайней мере все заработало)) я прописал свойства в классе
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB