2015-05-20 62 views
7

如何在沒有外鍵的情況下建立關係?定義沒有外鍵的關係

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

這就提出了一個錯誤:
ArgumentError: Could not locate any simple equality expressions involving locally mapped foreign key columns for primary join condition

這工作,但我認爲這是一個非常醜陋的黑客。

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

有沒有更好的方法來做到這一點?

編輯:額外的屬性需要被添加爲@declared_attr並有權使用的關係,因爲我們的串行上是這麼寫它declarred ATTRS工作。

這樣做與@hybrid_property或其他工作,但然後我們的json序列化程序將打破。讓它工作似乎比定義關係更難。

回答

-2

也許你應該指出「關係」一詞的意思。它指出有些東西「依賴於」其他事物或兩者都取決於對方。 如果您試圖在ERM(實體關係模型)上定義關係,這意味着您應該應該指出其中一個實體「依賴於」另一個實體。另外,數據庫還有一些竅門,可以更快速地處理與相互關聯的表格,而不僅僅是簡單的表格,這些表格是以抽象的方式進行關聯的 你有什麼理由需要這樣做嗎?

+0

這不提供問題的答案。 – SaeX

0

在數據庫中創建表時,您不一定必須定義關係(這幾乎適用於每個SQL)。您仍然可以連接沒有預定義外鍵關係的表(外鍵的主要原因是爲了強制數據一致性,而不是定義可以加入或不加入的外鍵)。

參考見本 - http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join

如果你仍想「秀」的數據庫和表結構/模型,然後更好地使用一些實體關係建模像ERwin的(或繪圖軟件)。

+0

更多這裏 - http://stackoverflow.com/questions/5771190/can-we-join-two-tables-without-primary-foreign-key-relation – kasparg

+1

更正,我「應該」能夠定義一種關係,而不會預先鍵。問題是sqlalchemy在這種情況下會拋出一個錯誤,我想知道如何完成這個工作。 – zidarsk8