使用会话对象仅选择某些表中的某些列

时间:2010-08-02 15:49:43

标签: python sqlalchemy

我有这些classe,其中items(class Item)与channel对象有关:

channel_items = Table(
        "channel_items",
        metadata,
        Column("channel_id", Integer,
            ForeignKey("channels.id")),
        Column("item_id", Integer,
            ForeignKey(Item.id))
    )


class Channel(rdb.Model):
    """ Set up channels table in the database """
    rdb.metadata(metadata)
    rdb.tablename("channels")

    id = Column("id", Integer, primary_key=True)
    title = Column("title", String(100))

    items = relation(Item, secondary=channel_items, backref="channels")

class Item(rdb.Model):
    """ Set up items table in the database """
    rdb.metadata(metadata)
    rdb.tablename("items")

    id = Column("id", Integer, primary_key=True)
    title = Column("title", String(100))

我知道如何使用以下内容获取所有列:

session = rdb.Session() channels = session.query(Channel).order_by(Channel.title)

但是,我想从两个表中获取一些列,并将channel对象中的字段项与Item类相关联,因为我尝试过这样的事情:

session = rdb.Session()
channels = session.query(Channel.title, Item.title).order_by(Channel.title)

我获得了频道标题和项目标题,但我只是从每个频道获得一个项目。我想获得与每个频道相关的所有项目。

提前致谢!

1 个答案:

答案 0 :(得分:1)

你想加入这里,而不是笛卡尔产品。

如果我理解正确,并且您只想选择标题,而不是建立实际实例,则可以这样做:

session = rdb.Session()
result = session.query(Channel).join(Channel.items).values(Channel.title, Item.title)

结果是生成器,它将为您提供(Channel.title, Item.title)个元组。 因此,如果您有一些'channel1'有两个项'item1'和'item2',您将收到 [('channel1', 'item1'), ('channel1', 'item2')]

如果你只需要加载与其相关项目的频道,你可能会想要这样:

from sqlalchemy.orm import eagerload
channels = session.query(Channel).options(eagerload('items')).all()
channels[0].items[0].title