Je suis tout neuf à Sqlalchemy. Essayer d'obtenir une requête de travailler et d'avoir des problèmes avec une jointure.
J'ai deux tables qui ont toutes deux une colonne nommée "ID" et je dois participer à cette table. Mon code ressemble à ceci: p> Il en résulte le message d'erreur suivant: P> Combinaison implicitement de la colonne Table1.Id avec la colonne Table2.Id sous l'attribut "ID". Veuillez configurer un ou plusieurs attributs pour ces colonnes identiques appelées explicitement. P>
blockQuote> question est, comment puis-je configurer ces attributs? p> tia! p> p>
4 Réponses :
Vous pouvez utiliser une fonction de jointure fournie par SQLALCHEMY,
Voir l'exemple ci-dessous, pas besoin de le faire manuellement sqlalchme le fait pour nous,
Cette solution échelle évite le problème de base. Vous vous demandez toujours comment procéder à cela avec des modèles mappés dynamiquement utilisant SQLSOUP.
avec soupe SQL
joined = server.session.query(table1).join((table2,table1.id == table2.id)) where = table1.createDate > start results = joined.filter(where).all()
J'ai eu ce même problème, donc je pensais que j'ajouterais la solution que j'ai proposée (basée sur http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg23735.html ). Ce n'est certainement pas la chose la plus propre que j'ai jamais codée, mais en utilisant votre exemple d'en haut, ce serait approximativement:
from sqlalchemy import select aliased_table1 = select([ table1.c.Id.label("renamed_id_col"), table1.c.any_other_columns_you_want_returned_but_not_renamed, ... ]).correlate(None).alias() joined = server.join(aliased_table1, table2, aliased_table1.c.renamed_id_col == table2.Id) where = aliased_table1.c.createDate > start results = joined.filter(where).all()
Une manière à ce sujet consiste à étiqueter toutes les colonnes de l'une des tables, de sorte que vous n'avez pas de collision des noms de colonne:
table1 = server.tab1 table2 = server.with_labels(server.tab2) joined = server.join(table1,table2, table1.Id == table2.tab2_Id) where = table1.createDate > start results = joined.filter(where).all()