Je n'ai pas beaucoup d'expérience avec SQLAlchemy et j'ai un problème que je ne peux pas résoudre. J'ai essayé de chercher et j'ai essayé beaucoup de code. Ceci est ma classe (réduite au code le plus significatif):
class Patient(Base):
__tablename__ = 'patients'
id = Column(Integer, primary_key=True, nullable=False)
mother_id = Column(Integer, ForeignKey('patients.id'), index=True)
mother = relationship('Patient', primaryjoin='Patient.id==Patient.mother_id', remote_side='Patient.id', uselist=False)
phenoscore = Column(Float)
et je voudrais interroger tous les patients, dont le phénoscore de la mère est (par exemple) == 10
Comme dit, j'ai essayé beaucoup de code, mais je ne comprends pas. La solution logique, à mes yeux, serait
patients = Patient.query.filter(Patient.mother.phenoscore == 10)
car, vous pouvez accéder .mother.phenoscore
à chaque élément lors de la sortie, mais ce code ne le fait pas.
Y a-t-il une possibilité (directe) de filtrer par un attribut d'une relation (sans écrire l'instruction SQL, ou une déclaration de jointure supplémentaire), j'ai besoin de ce type de filtre plus d'une fois.
Même s'il n'y a pas de solution facile, je suis heureux d'obtenir toutes les réponses.
la source
has()
prend en charge à la fois l'expression de condition en tant qu'argument sans nom etfilter_by
arguments de mot-clé -style. Ce dernier me semble plus lisible.phenoscore = 10
.filter_by
ne prend que les mots-clés d'égalité (car il fait juste ** kwargs sur eux)Vous devez interroger la relationip avec jointure
Vous obtiendrez l'exemple de ces stratégies de requêtes auto-référentielles
la source
Je l'ai utilisé avec des sessions, mais une autre façon d'accéder directement au champ de relation est
Je ne l'ai pas testé, mais je suppose que cela fonctionnerait aussi
la source
Bonne nouvelle pour vous: j'ai récemment créé un package qui vous permet de filtrer / trier avec des chaînes "magiques" comme dans Django , vous pouvez donc maintenant écrire quelque chose comme
C'est beaucoup plus court, en particulier pour les filtres complexes, disons,
J'espère que vous apprécierez ce forfait
https://github.com/absent1706/sqlalchemy-mixins#django-like-queries
la source
Il s'agit d'une réponse plus générale sur la façon d'interroger les relations.
Cela vous permet de:
la source