2012-06-28 65 views
1

我有多種類型的認證,因此,我有一個基postgres的表(稱爲「認證」),以及其他類型的認證從它派生。例如,使用密碼進行身份驗證的實體稱爲「password_authentications」,並使用postgres從「身份驗證」表中繼承。該模式是這樣的:Postgres的繼承與SQLAlchemy的:SQLAlchemy的關係

CREATE TABLE authentications (
id 
) 

CREATE TABLE password_authentications (
id 
password 
) inherits (authentications) 

這是非常優雅的,因爲我也有一個名爲「用戶」表中有一個外鍵進入認證表:

CREATE TABLE users (
id 
username 
authentications_id 
) 

因此用戶可以通過認證任何繼承認證的東西。所以在將來,如果我們需要使用RSA對用戶進行身份驗證(例如),我所要做的就是從描述RSA身份驗證的身份驗證中創建一個基類。

現在我想用SQLAlchemy建立Python類和這個結構之間的映射。具體來說,我想映射一個名爲「User」的類到名爲「users」的表(這很容易完成),但我想要在password_authentication(而不是身份驗證)上建立關係。實際上,我期望動態地建立這種關係,所以如果一個用戶使用密碼進行身份驗證,那麼SQLAlchemy會將「Users」表連接到「Password_Authentications」表。如果存在另一種類型的認證,則用戶應該鏈接到該表。用戶將鏈接到的所有表格的唯一共同之處在於它們來自Authentications表。因此,「用戶」表有一個外鍵到這個表中。

我該如何完成上述操作?它甚至有可能嗎?

回答

3

根據模型對象的繼承,SA不支持的postgresql。不過,請看PostgreSQLInheritance配方,其中Mike顯示瞭如何將兩者一起使用及其侷限性。

也可參考答案Python, SQLAlchemy and Postgresql: understanding inheritance,其中TokenMacGuy解釋Inheritance in terms of OOPpostgresql table inheritance之間的差異。


從鏈接的資源發佈的代碼示例會導致不必要的重複和相當長的答案,仍然不能夠爲您提供完整的解決方案。

+0

但是每個postgres表都有一個tableoid列,它可以非常容易地用作混淆繼承的鑑別器。所以我不明白爲什麼這不起作用! –

+0

爲什麼我不能用tableoid作爲鑑別器來使用具體的表繼承? –

+1

我相信你可以使它工作,但它不會像你想象的那麼好和便攜:1)你無法控制'tableoid'; 2)它們是數字的,並非如此*可讀*; 3)你也必須在你的Python模型中爲每個'polymorphic_identity'值硬編碼它們的值; 4)當你從'test'移植到'production'時,'tableoid'可能又會有所不同,所以你將不得不改變你的代碼庫來使它工作;我相信還有其他的一些注意事項,我甚至無法想象,因爲我不使用'postresql'。 – van