J'ai deux tables J'ai créé une requête SQL dans PostgreSQL qui va combiner ces deux tables et générer des résultats suivants: p> Cependant, je ne peux pas créer une représentation sqlalchimy de celui-ci. J'ai essayé plusieurs façons d'implémenter barbe code> et
Moustache code> défini ci-dessous:
de_statement code> à
outerjoin code> mais aucun d'entre eux n'a vraiment travaillé. Quelqu'un peut-il m'aider avec ça? P> p>
5 Réponses :
de @francis p 's Suggestion J'ai proposé cet extrait: 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 code> dans SQLalchemy. p> p>
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.
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)
Quand ce style ( SELECT CODE>) doit-il être utilisé à la place de la manière "normale" (
session.Query code>)?
@MatthewMoisen: Aussi loin que je sache, vous ne pouvez pas mettre un .Query code> à l'intérieur d'une clause de la clause.
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)
Malheureusement, SQLalchemy ne fournit que API pour Cependant, dans SQLalchemy, nous devons interroger sur une classe puis effectuer Il suffit d'ajouter aux réponses, vous pouvez trouver l'utilisation de Rejoignez-vous de l'extérieur gauche code> comme
.outerJoin () code>
. Comme mentionné ci-dessus , nous pourrions obtenir un joint externe droit code> en inversant les opérandes de
Rejoindre l'extérieur gauche code>; par exemple.
A Right Rejoindre B CODE> est identique à celui de
B gauche rejoindre un code>.
Dans SQL, les affirmations suivantes sont équivalentes:
rejoindre code>. 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. P>
select_from Code> de SQLALCHEMY DOC . p> p>
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()
Que signifie cette clause "sur"?
Il ne fait aucune vérification pour la mise en œuvre
rejoindre code>
Pourquoi voudriez-vous que le résultat soit représenté dans ce format plutôt que dans une personne code> classe code> classe et deux relations
personne.beards code> et
personne.mustashes code>? Fondamentalement, ma question est la suivante: pourquoi utiliser
sqlalchemy code> pour faire quelque chose afin
SQL code>? 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 () code >, et la requête générée sera très similaire, mais le résultat serait toujours une instance de
personne code> et non un
tuple code>.
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 code> qui va tous les combiner pour créer une seule liste. Afin que je puisse appliquer des opérations comme
ordre par code> sur cette liste