2012-03-02 3 views
0

Я смущен, как функция .label (...) работает в SqlAlchemy. У меня есть что-то вроде этого запроса:sqlalchemy label

data = session.query(Coupon, func.isnull(Order.coupon_code).label("redeemed")) \ 
    .outerjoin((Order, Order.coupon_code == Coupon.coupon_code)) \ 
    .all() 

При выполнении этого запроса, я вижу, как order.coupon_code выкуплены в результате запроса, но в обратном ряду данных я получаю две вещи, купон структуры и «0» или «1»). Выглядит примерно так:

[(Coupon: 
    coupon_id = 1234 
    etc 
    , 0), 
... ] 

То, что я хотел бы это, если «0» или «1» были названы «искупил» со значением «0» или «1». Что-то вроде этого:

[(Coupon: 
    coupon_id = 1234 
    etc 
    , 
    redeemed = 0), 
... ] 

Я думаю, я не понимаю, что делает для меня метка, если что-нибудь. Если у кого-то есть какие-то намеки или указания о том, как я могу получить данные так, как я думаю, это было бы очень полезно!

Спасибо, Doug

ответ

0

Вы можете карту вычислить значение атрибутов класса с использованием column_property, который, кажется, чтобы быть ближе к тому, что вы хотите.

+0

Спасибо за подсказку, column_property выглядит очень полезным, хотя я не уверен, что это так в этом случае. Я мог бы просто получить все от обоих объектов в запросе, таких как session.query (Купон, Заказ), но мне действительно нужно получить одно поле Order.coupon_code из Order. –

0

Проверить это

from sqlalchemy import create_engine 

engine = create_engine('mysql://test:[email protected]/test', echo=True) 
from sqlalchemy.orm import sessionmaker 

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Date, Column, Integer 


Base = declarative_base() 



class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True, autoincrement=True) 
    day = Column(Date, unique=True) 


if __name__ == '__main__': 

    Base.metadata.create_all(engine) 
    Session = sessionmaker(engine) 
    session = Session() 

    a = session.query(User.day.label('test')).all() 

    print "New Label :", a[0].test 
    print "DIR :", dir(a[0]) 

При запуске сценария и последнее утверждение dir первой строки. И там вы получите атрибут test.

+0

Спасибо за отзыв и пример, что очень полезно. Я попробую об этом в моем контексте и посмотрю, дает ли он мне то, что мне нужно. –