Vzor, který se snažíte implementovat, je zvláštní případ vztahu mnoho k mnoha. SQLAlchemy tomu říká Adjacency List Relationship a já doporučuji zkusit procházet kódem:
http://docs.sqlalchemy.org/en /rel_0_9/orm/relationships.html#adjacency-list-relationships
Klíčem je tam kwarg 'remote_side'.
Zde je důvod:chyba, kterou dostáváte, je, že vaše asociační tabulka ('friends') má dva cizí klíče ukazující na tabulku 'users':jeden ve sloupci 'user_id' a jeden ve sloupci 'friend_id'. SQLAlchemy se pokouší automaticky detekovat vztahy na základě cizích klíčů, ale selže, protože nedokáže určit, kterým směrem se vztah ubírá. Takže pokud máte záznam v tabulce 'přátelé', tak
user_id : 1
friend_id : 2
SQLAlchemy nedokáže říct, zda má uživatel user_1 za přítele uživatele 2 nebo naopak.
Pokud se to zdá matoucí, je to tak. Přátelství ve smyslu sociálních sítí může být unijektivní , v takovém případě uživatel_1, který má přítele uživatel_2, neznamená, že uživatel_2 má uživatele_1 jako přítele; nebo může být bijektivní , v takovém případě jsou oba ekvivalentní. Zde ukazuji svůj věk, ale první zastupuje Livejournal, zatímco druhý zastupuje Facebook.
Nevím z hlavy, jak implementovat jednotný vztah v SQLAlchemy. Je to ošklivý UNION ALL nebo něco podobného v MySQL.