Je veux faire l'équivalent de
q1 = session.query(Baz.foo, Quux.bar).join(Quux) q2 = session.query(Baz.foo, None) # ^^^^ This breaks!
3 Réponses :
J'ai réussi à le faire. La solution ressemble à ceci:
Une autre option consiste à utiliser sqlalchemy.text () avec une instruction SELECT, comme:
Une solution plus simple est d'utiliser SQLALCHEMY.NULL ():
q1 = session.query(Baz.foo, Quux.bar) \ .join(Quux.bar) q2 = session.query(Baz.foo, sqlalchemy.null().label('null_bar')) qall = q1.union(q2) foocol = qall.column_descriptions[0]['expr'] qgrp = qall.group_by([col['name'] for col in qall.column_descriptions]) q = qgrp.having(foocol == 'John Doe') q.all()
On dirait que vous essayez de faire l'équivalent d'une jointure extérieure. Peut-être qu'il y a un moyen de le faire dans MySQL.
C'est très similaire à une jointure extérieure. Le problème est que je ne veux pas de lignes de QUX avec bar = null; Quux n'a pas de telles lignes. Je veux ajouter des rangées supplémentaires dans l'union avec cette colonne null.
En outre, je n'ai pas mis trop bien un point dessus, puisque ma question est vraiment sur Sqlalchemy, mais la base de données que je demande sur est en fait Firebird. La requête SQL fournie renvoie les résultats souhaités, je n'ai tout simplement pas compris comment exprimer cela à Sqlalchemy.
Oups, je suis désolé, je voulais dire "sqlalchemy", pas "mysql". Je pensais un et j'ai tapé l'autre. soupir i> Et je crois qu'une jointure extérieure gauche vous donnera tout ce qu'il y a une valeur dans la barre, quelle que soit sa valeur correspondant à une valeur à Quux. Il remplira NULL pour toutes les valeurs de champ de LUX s'il n'y a pas de rang de quux correspondant.