我有一對看起來有點像這樣(簡化的示例)的PostgreSQL表:從people
用SQLAlchemy對這種類型的繼承進行建模的正確方法是什麼?
CREATE TABLE people (
id SERIAL PRIMARY KEY,
created timestamp with time zone DEFAULT now() NOT NULL,
modified timestamp with time zone NULL,
email varchar NOT NULL UNIQUE,
inactive boolean NOT NULL DEFAULT False
);
CREATE TABLE engineers (
id integer NOT NULL REFERENCES people(id) ON DELETE CASCADE ON UPDATE CASCADE UNIQUE,
created timestamp with time zone DEFAULT now() NOT NULL,
modified timestamp with time zone NULL,
login_name varchar NOT NULL UNIQUE,
PRIMARY KEY(id)
);
engineers
繼承因爲「ID」列people
穿過到engineers
作爲外鍵。該列也被定義爲兩個表中的主鍵。如果我想查詢LOGIN_NAME使用某人的電子郵件地址,就可以像這樣通過SQL完成:
SELECT p.email FROM engineers e
JOIN people p ON p.id = e.id
WHERE p.inactive = False AND e.login_name = 'john.smith';
如何使用模型SQLAlchemy的的聲明式的這種關係,並執行類似的查詢?看起來像「Joined Table Inheritance」描述了我的使用場景,但我的表中沒有鑑別器列。我也一直在嘗試使用「Concrete Table Inheritance」,但我只是想迷惑自己。
我會很感激任何建議。謝謝!
編輯
的原因,這表結構是現在這個樣子是因爲「人」可能是一個「工程師」,「會計」,或「測試」(或三者的某種組合)。該people
表包含共同的每一個人的屬性,諸如姓名,電話,數字,租賃日期等
「創建」和在engineers
表people
之間不共享「修飾的」列;這兩列對每個表都是不同的。這些不是絕對必要的,它們只是默認添加到數據庫中的每個表定義中,並用於跟蹤用於審計/日誌記錄目的的更改。
哇。感謝您的詳細回覆。我編輯了這個問題來解決點#1和#2。明天早上我會花更多的時間用你的例子。 – jamieb 2013-05-06 05:15:52