使用会话对象选择某些表的特定列
我有一些类,其中的项目(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