2012-05-19 3 views
0

J'utilise sql alchemy dans mon projet.Comment faire une requête sur l'attribut table jointe dans sqlachemy

J'ai un problème lorsque deux tables ou plus sont jointes ou ont une relation de clé étrangère alors je ne peux pas interroger l'attribut de tables jointes dans la condition where.

Par exemple. J'ai remarqué une table et une table utilisateur user.id est la clé étrangère de notice.sender maintenant je veux chercher avis par user.name

  1. table avis: [id, l'expéditeur (FK user.id), récepteur (FK user.id), sous réserve, message, état]

  2. table utilisateur: [id, nom, email, adresse, état]

Inscrivez-vous dans le modèle d'avis:

sender_user = relationship('User', primaryjoin='Notice.sender==user.id', backref=backref("sender_user")) 
receiver_user = relationship('User', primaryjoin='Notice.receiver==user.id', backref=backref("receiver_user")) 

requête SQL filtre alchimie:

user_name='john' 

    notice=db_session.query(Notice) 
    notice = notice.filter(Notice.sender_user.name == user_name) 

Après requête ne fonctionne:

notice=db_session.query(Notice) 
    notice = notice.filter(Notice.user.name == user_name) 

S'il vous plaît aider!

+1

Dans la deuxième requête, voulez-vous dire 'notice.sender.name'? – jadkik94

+1

Quelle est votre erreur? – jadkik94

+0

@ jadkik94 Pour la deuxième erreur de requête est: Ni objet 'InstrumentedAttribute' ni objet 'Comparator' a un attribut 'name' – anils

Répondre

0

Vous devez acquérir un objet de session, puis faites:

query = session.query(Notice).filter(Notice.sender_user.name == user_name) 
results = query.all() 

Si cela ne fonctionne pas (vous ne recevez pas les résultats escomptés), essayez de faire ceci:

session.query(Notice, User.name).filter((Notice.sender_user.id == User.id) & (User.name == user_name)) 
results = query.all() 

Je suppose que vous avez également un champ appelé sender qui est l'identifiant de l'utilisateur. Ensuite, cela devrait également fonctionner:

session.query(Notice, User.name).filter((Notice.sender == User.id) & (User.name == user_name)) 

Réessayez tous, j'ai fait quelques petites modifications. (Vous pouvez les voir dans l'historique des révisions). Ce serait bizarre s'ils ne fonctionnent pas ... (Si ce n'est pas le cas, essayez de poster la question sur le SQLAlchemy mailing list)

+0

Salut, j'ai raté une ligne en question, mise à jour du code concernant ce qui est avis – anils

+0

Ok. C'est bizarre, ça aurait du marcher ... Voir ma mise à jour pour d'autres options. – jadkik94

Questions connexes