我有一对 PostgreSQL 表,看起来有点像这样(简化示例):
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
继承自,people
因为“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
表包含每个人共有的属性,例如姓名、电话、号码、雇用日期等。
表上的“created”和“modified”列engineers
不共享people
;这两列对于每个表都是不同的。这些不是绝对必要的,它们只是默认添加到数据库中的每个表定义中,并用于跟踪更改以进行审计/日志记录。