【问题标题】:Postgres inheritance with SQLAlchemy: SQLAlchemy Relationships使用 SQLAlchemy 继承 Postgres:SQLAlchemy 关系
【发布时间】:2012-06-28 19:07:46
【问题描述】:

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

CREATE TABLE authentications (
 id 
)

CREATE TABLE password_authentications (
 id
 password
) inherits (authentications)

这非常优雅,因为我还有一个名为“Users”的表,它在身份验证表中有一个外键:

CREATE TABLE users (
 id
 username
 authentications_id
)

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

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

我怎样才能完成上述任务?有没有可能?

【问题讨论】:

    标签: postgresql sqlalchemy


    【解决方案1】:

    SA 在模型对象继承方面不支持postgresqlINHERITS。不过,请查看PostgreSQLInheritance 配方,其中Mike 显示了如何将两者结合使用及其局限性。

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


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

    【讨论】:

    • 但是每个 postgres 表都有一个 tableoid 列,可以很容易地用作具体继承的判别器。所以我不明白为什么这不起作用!
    • 为什么不能用tableoid作为判别器的具体表继承???
    • 我相信你可以让它工作,但它不会像你想象的那么好和便携:1)你无法控制tableoids; 2) 它们是数字的,不那么可读; 3) 您还必须在 Python 模型中为每个 polymorphic_identity 值硬编码它们的值; 4) 一旦您从test 迁移到productiontableoids 可能会再次不同,因此您必须更改您的代码库以使其工作;...我相信还有其他警告,我什至无法想到,因为我不使用postresql
    猜你喜欢
    • 2012-10-06
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多