8
votes

Sélectionner NULL dans SQLALCHÉMY

Je veux faire l'équivalent de

q1 = session.query(Baz.foo, Quux.bar).join(Quux)
q2 = session.query(Baz.foo, None)
#                           ^^^^ This breaks!


4 commentaires

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 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.


3 Réponses :


2
votes

J'ai réussi à le faire. La solution ressemble à ceci: xxx


0 commentaires

-1
votes

Une autre option consiste à utiliser sqlalchemy.text () avec une instruction SELECT, comme: xxx


0 commentaires

13
votes

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()


0 commentaires