2015-05-20 19 views
7

Jak mogę nawiązać związek bez obcego klucza?Definiowanie relacji bez klucza obcego

@declared_attr 
def custom_stuff(cls): 
    joinstr = 'foreign(Custom.name) == "{name}"'.format(name=cls.__name__) 
    return db.relationship('Custom', primaryjoin=joinstr) 

Rodzi błąd:
ArgumentError: Could not locate any simple equality expressions involving locally mapped foreign key columns for primary join condition

To działa, ale myślę, że to dość brzydki Hack.

@declared_attr 
def custom_stuff(cls): 
    joinstr = 'or_(
        and_(foreign(Custom.name) == MyTable.title, 
         foreign(Custom.name) != MyTable.title), 
        foreign(Custom.name) == "{name}")'.format(name=cls.__name__) 
    return db.relationship('Custom', primaryjoin=joinstr) 

Czy jest lepszy sposób to zrobić?

EDIT: potrzebuje dodatkowy atrybut zostać dodany jako @declared_attr i musi użyć relacji, ponieważ nasza serializer jest napisany tak, że współpracuje z declarred attrs.

Robiąc to z @hybrid_property lub czymś innym by działało, ale wtedy nasz seriser json mógłby się zepsuć. Przygotowanie do pracy wydaje się trudniejsze niż zdefiniowanie związku.

Odpowiedz

-2

Może powinieneś wskazać na znaczenie słowa "związek". Stwierdza, że ​​pewne rzeczy "zależą" od czegoś innego lub od siebie zależą. Jeśli próbujesz zdefiniować relację na ERM (Entity Relationship Model), oznacza to, że musisz określić, który z elementów "zależy" od drugiego. Ponadto, bazy danych mają kilka hacków do szybszego radzenia sobie z tabelami odnoszącymi się do siebie nawzajem, niż tylko prostymi tabelami, które są powiązane w górny abstrakcyjny sposób. Czy jest jakikolwiek powód, dla którego musisz to zrobić?

+0

To nie daje odpowiedzi na pytanie. – SaeX

0

Nie musisz definiować relacji podczas tworzenia tabel w bazie danych (dotyczy to prawie każdego SQL). Nadal można łączyć tabele, które nie mają uprzednio zdefiniowanej relacji klucza obcego (głównym powodem kluczy obcych jest wymuszanie spójności danych, a nie definiowanie, do czego można dołączyć, lub nie).

Zobacz ten odsyłającego - http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join

Jeśli nadal chcesz do „show” struktura bazy danych i tabeli/modelu, to lepiej korzystać z niektórych relacji podmiot Modeler jak Erwin (lub jakiś program diagramów).

+0

więcej tutaj - http://stackoverflow.com/questions/5771190/can-we-join-two-tables-without-primary-foreign-key-relation – kasparg

+1

Korekta, ja "powinienem" być w stanie zdefiniować związek bez uprzedzenia klawiatura. Problem polega na tym, że sqlalchemy zgłasza błąd w tym przypadku i chciałbym dowiedzieć się, jak wykonać tę pracę. – zidarsk8

Powiązane problemy