我有一对看起来有点像这样(简化的示例)的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