5 votes

SQLAlchemy select from two tables with null LEFT JOIN retourne un résultat vide

J'ai deux tables sql. Table 1 (id, nom) et Table 2 avec (id, nom, table1_id)

 sql = text('SELECT t1.*, t2.* FROM table1 t1 '
               'LEFT JOIN table2 t2 ON t1.id=t2.table1_id ')
query = db.session.query(Table1, Table2).from_statement(sql).params()
table1_table2_tuple_list = query.all()

Si le résultat de la requête sql est

67, 'some name', 1, 'some name in table 2', 67

Ensuite, tout est OK et j'ai [(<Table1>, <Table2>)] pour table1_table2_tuple_list

Mais Si le résultat de la requête sql est : (également tous les autres codes sont pour ce résultat)

67, 'some name', Null, Null, Null

Alors, au lieu de recevoir [(<Table1>, None)] Je reçois [(None, None)]

Si je change un peu mon code :

sql = text('SELECT t1.*, t2.id, t2.name,t1.id FROM table1 t1 '
               'LEFT JOIN table2 t2 ON t1.id=t2.table1_id ')
query = db.session.query(Table1, Table2, Table1.id).from_statement(sql).params()
table1_table2_tuple_list = query.all()

Alors je reçois :

[<Table1>, <Table2>, 1]

Mais dans ce cas, je ne suis même pas sûr que ce soit correct car je fais correspondre deux colonnes du SQL au modèle Table2 qui a trois colonnes. Je ne sais pas du tout pourquoi cela fonctionne, mais tout semble en place. Ce n'est toujours pas ce que je veux, car je ne veux pas revenir à cette requête et spécifier encore et encore de nouvelles colonnes s'il y en a pour Table2.

Ce dont j'ai besoin, c'est d'un moyen de sélectionner deux tables avec du sql pur, et de faire correspondre le résultat à mes modèles. Je veux également obtenir le résultat même dans les cas où l'une des tables n'a pas de valeur dans ses colonnes de résultat. J'espère avoir été clair. Mon objectif est de recevoir

[(<Table1>, None)]

lorsque la requête porte sur toutes les colonnes ( SELECT t1.*, t2.* ) et il y a LEFT JOIN avec null ajouté.

12voto

Mikhail Berlinkov Points 1184

Le problème est que vos tables ont des colonnes avec les mêmes noms. SqlAlchemy, après avoir exécuté votre requête, essaie de faire correspondre les colonnes résultantes par les noms (et non par les positions) et choisit une correspondance qui convient (dans ce cas, SA a fait correspondre les colonnes de Table2 avec les champs de Table1 et vice versa). Il y a un moyen de spécifier la correspondance avec Méthode .columns() mais je vous suggère d'envisager d'utiliser orm-fonctions de SqlAlchemy à la place chaque fois que possible, à moins que vous n'ayez de fortes raisons de ne pas le faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X