2010-11-01 4 views
0

J'ai une relation simple à un grand nombre mappée avec sqlalchemy:sqlalchemy Sélectionner le type de Relation

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) 

Je veux interroger tous les types jamais utilisé dans une entité. Dans SQL pur j'accomplir ceci par:

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

Comment puis-je résoudre cela en utilisant ORM-Engine sqlalchemy?

J'ai essayé ces questions, mais ils ont tous ne reviennent pas ce que je veux:

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

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

J'ai aussi essayé d'utiliser options(joinedload('type')), mais j'ai découvert, cela est uniquement utilisé pour forcer le chargement désireux et pour contourner le chargement paresseux.

AJOUT: Je viens d'ajouter le backref dans le relation de Entity. Je pense que le problème est résolu en interrogeant count(Type.entities) > 0, mais je ne peux pas comprendre comment former une requête ORM valide.

Répondre

1

Je viens tout compris:

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

Le any() le tour est joué.

Questions connexes