简体   繁体   English

sqlalchemy多个外键到同一个表

[英]sqlalchemy multiple foreign keys to same table

I have a postgres database that looks something like this: 我有一个postgres数据库,看起来像这样:

      Table "public.entities"
    Column     |            Type             |                   Modifiers                    
---------------+-----------------------------+------------------------------------------------
 id            | bigint                      | not null default nextval('guid_seq'::regclass)
 type_id       | smallint                    | not null
 name          | character varying           | 
Indexes:
    "entities_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "entities_parent_id_fkey" FOREIGN KEY (parent_id) REFERENCES entities(id)
    "entities_type_id_fkey" FOREIGN KEY (type_id) REFERENCES entity_types(id)
Referenced by:
    TABLE "posts" CONSTRAINT "posts_id_fkey" FOREIGN KEY (id) REFERENCES entities(id)
    TABLE "posts" CONSTRAINT "posts_subject_1_fkey" FOREIGN KEY (subject_1) REFERENCES entities(id)
    TABLE "posts" CONSTRAINT "posts_subject_2_fkey" FOREIGN KEY (subject_2) REFERENCES entities(id)

    Table "public.posts"
  Column   |  Type  | Modifiers 
-----------+--------+-----------
 id        | bigint | not null
 poster_id | bigint | 
 subject_1 | bigint | not null 
 subject_2 | bigint | not null 
Indexes:
    "posts_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "posts_id_fkey" FOREIGN KEY (id) REFERENCES entities(id)
    "posts_poster_id_fkey" FOREIGN KEY (poster_id) REFERENCES users(id)
    "posts_subject_1_fkey" FOREIGN KEY (subject_1) REFERENCES entities(id)
    "posts_subject_2_fkey" FOREIGN KEY (subject_2) REFERENCES entities(id)

I'm trying to figure out how to define the orm object for "posts" to include all 3 of the foreign keys. 我试图弄清楚如何为“posts”定义orm对象以包含所有3个外键。 Notice only id is a primary key. 请注意,只有id是主键。 The others are just relationships between posts and entities that are not to be pk'd. 其他只是帖子和实体之间的关系,不是pk'd。

class PostModel(EntitiesModel):
    __tablename__ = 'posts'

    id = db.Column(db.BigInteger, db.ForeignKey(EntitiesModel.id), primary_key=True, nullable=False)
    poster_id = db.Column(db.BigInteger, db.ForeignKey(UserModel.id), nullable=False)

    subject_1 = db.Column(db.BigInteger, db.ForeignKey(EntitiesModel.id), nullable=False)
    subject_2 = db.Column(db.BigInteger, db.ForeignKey(EntitiesModel.id), nullable=False)

I've tried fiddling with it a bit, and besides disabling the foreign keys on subject_1 I can't seem to come up with a solution that doesn't result in this error: 我尝试了一下它,并且除了禁用subject_1上的外键之外,我似乎无法想出一个不会导致此错误的解决方案:

AmbiguousForeignKeysError: Can't determine join between 'entities' and 'posts'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly.

Any thoughts? 有什么想法吗?

It's not completely clear what exactly is causing the problem since you omitted the most important part -- code that throws that exception but if adding relationship properties to class PostModel throws that try to add foreign_keys parameter to relationship call as the following: 由于您省略了最重要的部分 - 引发该异常的代码但是如果向类PostModel添加关系属性抛出尝试将foreign_keys参数添加到关系调用中,则不完全清楚究竟是什么导致了该问题,如下所示:

class PostModel(...):
    # ...
    subject1_id = Column(db.Column(db.BigInteger, db.ForeignKey(EntitiesModel.id), nullable=False)
    subject2_id = Column(db.Column(db.BigInteger, db.ForeignKey(EntitiesModel.id), nullable=False)
    subject1 = relationship(EntitiesModel, foreign_keys=subject1_id)
    subject2 = relationship(EntitiesModel, foreign_keys=subject2_id)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM