使用会话对象选择某些表的特定列

1 投票
1 回答
1190 浏览
提问于 2025-04-16 02:12

我有一些类,其中的项目(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)

不过,我想从这两个表中获取一些列,并且希望频道对象中的项目字段能够和Item类关联起来,因为我尝试过这样的方式:

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

我得到了频道的标题和项目的标题,但每个频道只获取到一个项目。我希望能获取到每个频道相关的所有项目。

谢谢大家!

1 个回答

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

撰写回答