【发布时间】:2013-05-06 02:58:53
【问题描述】:
我有一对 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 表包含所有人共有的属性,例如姓名、电话、号码、雇用日期等。
engineers 表上的“created”和“modified”列不在people 之间共享;这两列对于每个表都是不同的。这些不是绝对必要的,它们只是默认添加到数据库中的每个表定义中,并用于跟踪更改以进行审计/日志记录。
【问题讨论】:
标签: python orm sqlalchemy