SqlAlchemy Выберите тип отношения - PullRequest
0 голосов
/ 01 ноября 2010

У меня есть простое отношение «один ко многим», сопоставленное с SqlAlchemy:

Base = declarative_base()

class Type(Base):

    __tablename__ = "entity_types"

    type = Column(String(100), primary_key=True)
    description = Column(String(300))

class Entity(Base):

    __tablename__ = "entities"

    id = Column(Integer, primary_key=True)
    type_id = Column('type', String(100), ForeignKey(Types.type), 
                     nullable=False)
    type = relation(Type, backref='entities')
    value = Column(Text, nullable=False)

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

SELECT entity_types.*
FROM entities
    JOIN entity_types ON entities.type == entity_types.type
GROUP BY entity_types.type

Как мне решить эту проблему с помощью ORM-движка SqlAlchemy?

Я пробовал эти запросы, но все они не возвращаютЯ хочу:

session.query(Action.type).group_by(Action.type).all()

session.query(Type).select_from(Action).group_by(Type).all()

Я также пытался использовать options(joinedload('type')), но я обнаружил, что это используется только для принудительной загрузки и обхода отложенной загрузки.

ДОПОЛНЕНИЕ: Я только что добавил backref в relation из Entity.Я думаю, что проблему можно решить с помощью запроса count(Type.entities) > 0, но я не могу понять, как точно сформировать правильный запрос ORM.

1 Ответ

1 голос
/ 01 ноября 2010

Я только что понял:

session.query(ActionType).filter(ActionType.actions.any()).all()

any() добивается цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...