11
votes

Rejoindre extérieur droit dans Sqlalchemy

J'ai deux tables barbe et Moustache défini ci-dessous: xxx

J'ai créé une requête SQL dans PostgreSQL qui va combiner ces deux tables et générer des résultats suivants: xxx

Query: xxx

Cependant, je ne peux pas créer une représentation sqlalchimy de celui-ci. J'ai essayé plusieurs façons d'implémenter de_statement à outerjoin mais aucun d'entre eux n'a vraiment travaillé. Quelqu'un peut-il m'aider avec ça?


4 commentaires

Que signifie cette clause "sur"?


Il ne fait aucune vérification pour la mise en œuvre rejoindre


Pourquoi voudriez-vous que le résultat soit représenté dans ce format plutôt que dans une personne classe classe et deux relations personne.beards et personne.mustashes ? Fondamentalement, ma question est la suivante: pourquoi utiliser sqlalchemy pour faire quelque chose afin SQL ? Si vous avez défini des relations définies, vous pouvez simplement émettre des session.Quisery (personne) .Options (jointeload ('Beards'))). Options (jointeLoad ('MusThee S')). Tout () , et la requête générée sera très similaire, mais le résultat serait toujours une instance de personne et non un tuple .


La table mentionnée ci-dessus est une pseudo-table. Je cherche à créer une liste d'activités comme Facebook News Feed où tous les types de données sont là-bas à partir de goûts aux commentaires, etc. En supposant qu'ils ont une table différente pour chacun de ces objets afin de créer des informations sur Facebook News, il doit y avoir rejoindre qui va tous les combiner pour créer une seule liste. Afin que je puisse appliquer des opérations comme ordre par sur cette liste


5 Réponses :


4
votes

de @francis p 's Suggestion J'ai proposé cet extrait: xxx

Cependant, cela fonctionne, mais vous ne pouvez pas l'appeler comme une réponse car elle apparaît comme un hack. Ceci est une raison de plus pour laquelle il devrait y avoir droite rejoindre l'externe dans SQLalchemy.


1 commentaires

Ce n'est certainement pas un hack. J'utilise fréquemment une logique similaire, en utilisant SQLalchemy et SQLL SQL. Toutes les bases de données ne proposent pas des jointures extérieures. Netezza propose uniquement la «join gauche», «Joindre droit» et 'Rejoindre'. «Rejoignez» étant égal à la «jointure intérieure». Si vous voulez une jointure extérieure de Netezza, vous feriez quelque chose de similaire à celui-ci. Juste dire.



1
votes

Voici ce que j'ai eu, style orm:

from sqlalchemy.sql import select, false

stmt = (
    select([Beard, Moustache])
    .select_from(
        outerjoin(Beard, Moustache, false())
    ).apply_labels()
).union_all(
    select([Beard, Moustache])
    .select_from(
        outerjoin(Moustache, Beard, false())
    ).apply_labels()
)

session.query(Beard, Moustache).select_entity_from(stmt)


2 commentaires

Quand ce style ( SELECT ) doit-il être utilisé à la place de la manière "normale" ( session.Query )?


@MatthewMoisen: Aussi loin que je sache, vous ne pouvez pas mettre un .Query à l'intérieur d'une clause de la clause.



10
votes

dans SQL, Un joint externe droit B code> est équivalent de B gauche extérieur Rejoignez un code>. Donc, techniquement, il n'est pas nécessaire de ne pas avoir besoin dans la jointure extérieure code> API - il est possible de faire la même chose en commutant les lieux de la cible "Sélectionnable" et jointe "Sélectionnable". SQL Alchemy fournit une API pour cela:

# this **fictional** API:
query(A).join(B, right_outer_join=True)  # right_outer_join doesn't exist in SQLA!

# can be implemented in SQLA like this:
query(A).select_entity_from(B).join(A, isouter=True)


0 commentaires

0
votes

Malheureusement, SQLalchemy ne fournit que API pour Rejoignez-vous de l'extérieur gauche comme .outerJoin () . Comme mentionné ci-dessus , nous pourrions obtenir un joint externe droit en inversant les opérandes de Rejoindre l'extérieur gauche ; par exemple. A Right Rejoindre B est identique à celui de B gauche rejoindre un . Dans SQL, les affirmations suivantes sont équivalentes: xxx

Cependant, dans SQLalchemy, nous devons interroger sur une classe puis effectuer rejoindre . La partie délicate réécrit la déclaration SQLalchemy pour inverser les tables. Par exemple, les résultats des deux premières requêtes ci-dessous sont différents, car ils renvoient différents objets. xxx

Il suffit d'ajouter aux réponses, vous pouvez trouver l'utilisation de select_from de SQLALCHEMY DOC .


0 commentaires

2
votes

Si A, B sont des tables, vous pouvez réaliser:
Sélectionnez * à partir d'une droite Join B sur a.id = b.a_id où b.id = my_id code>
par:
Sélectionnez A. * de B Jonc sur A.Id = b.a_id où b.id = my_id code>
Dans SQLALCHEMY:

# import ...
from sqlalchemy import select

user_group_name, = session.query(Group.name)\
    .select_entity_from(select([User]))\
    .join(Group, User.group_id == Group.id)\
    .filter(User.id == 1).first()


0 commentaires