Чтобы выбрать только несколько столбцов из некоторых таблиц, используя объект сеанса - PullRequest
1 голос
/ 02 августа 2010

У меня есть эти классы, где элементы (класс Item) связаны с объектом канала:

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 () channel = session.query (Channel) .order_by (Channel.title)

Однако я хотел бы получить некоторые столбцы из обеих таблиц и элементов полей в объекте канала, которые будут связаны с классом Item, потому что я пробовал что-то вроде этого:

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

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

Заранее спасибо!

1 Ответ

1 голос
/ 03 августа 2010

Вы хотите присоединиться здесь, а не декартово произведение.

Если я вас правильно понимаю, и вы хотите выбрать только заголовки без создания реальных экземпляров, это можно сделать так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...