9
votes

Erreur SQLalchemy - "Veuillez configurer un ou plusieurs attributs pour ces colonnes identiques non nommées explicitement."

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: xxx

Il en résulte le message d'erreur suivant:

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.

question est, comment puis-je configurer ces attributs?

tia!


0 commentaires

4 Réponses :


-2
votes

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, xxx


1 commentaires

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.



2
votes

avec soupe SQL

joined = server.session.query(table1).join((table2,table1.id == table2.id))
where = table1.createDate > start
results = joined.filter(where).all()


0 commentaires

1
votes

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


0 commentaires

0
votes

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


0 commentaires