使用SQLAlchemy进行Postgres继承:SQLAlchemy Relationships

时间:2012-06-28 19:07:46

标签: postgresql sqlalchemy

我有多种类型的身份验证,因此我有一个基础postgres表(称为“身份验证”),并且从中派生出其他类型的身份验证。例如,使用密码进行身份验证的实体称为“ password_authentications ”,它使用postgres继承自“身份验证”表。因此架构是:

CREATE TABLE authentications (
 id 
)

CREATE TABLE password_authentications (
 id
 password
) inherits (authentications)

这非常优雅,因为我还有一个名为“Users”的表,它在authentications表中有一个foreignkey:

CREATE TABLE users (
 id
 username
 authentications_id
)

因此,用户可以通过继承自身份验证的任何内容进行身份验证。因此,将来,如果我们需要使用RSA对用户进行身份验证(例如),我所要做的就是从描述RSA身份验证的身份验证中创建一个基类。

现在我想使用SQLAlchemy在Python类和这个结构之间构建一个映射。具体来说,我想将一个名为“用户”的类映射到名为“用户”的表(这很容易),但我想要一个关于password_authentication的关系(不是关于身份验证)。实际上,我希望动态构建这种关系,因此如果使用密码对一个用户进行身份验证,则SQLAlchemy会将“Users”表链接到“Password_Authentications”表。如果存在其他类型的身份验证,则应将User链接到该表。 User将链接到的所有表的唯一共同点是它们是从Authentications表派生的。因此,“Users”表在此表中有一个外键。

我怎样才能完成上述目标?它甚至可能吗?

1 个答案:

答案 0 :(得分:3)

SA在模型对象继承方面不支持INHERITS postgresql。不过,请查看PostgreSQLInheritance食谱,其中Mike说明了如何将两者结合使用及其局限性。

另请参阅Python, SQLAlchemy and Postgresql: understanding inheritance的答案,TokenMacGuy解释了Inheritance in terms of OOPpostgresql table inheritance之间的区别。


从链接的资源中发布代码示例会导致不必要的重复和相当冗长的答案,但仍然无法为您提供完整的解决方案。