首页 > 解决方案 > 如何在 SQLAlchemy 中的两个表之间建立两个相似的关系?

问题描述

我已经回来并放弃了好几次。

从技术上讲,如果这有所作为,那就是烧瓶 sqlalchemy。我想我要做的是在 Pair 表中建立两个多对一(或者是一对一?)关系,它们都指的是 Word 表。一对必须有两个单词,一个单词可以有很多对。

class Pair(db.Model):
    __tablename__ = "pairs"

    id = db.Column(db.Integer, primary_key=True)

    word_id = db.Column(db.Integer, db.ForeignKey('words.id'), nullable=False)
    partner_id = db.Column(
        db.Integer, db.ForeignKey('words.id'), nullable=False)

    word_sound = db.Column(db.String(), nullable=False)
    partner_sound = db.Column(db.String(), nullable=False)

    # These two relationships are where I'm particularly lost. The words 1 and 2 need to
    # refer to two separate sounds, so I can't just have two words and two sounds in any
    # order. Therefore I need to have two one-to-one links to the same table:

    word1t = db.relationship(
        "Word", foreign_keys=[word_id], primaryjoin="Pair.word_id==Word.id",, back_populates="pairs")
    word2t = db.relationship(
        "Word", foreign_keys=[partner_id], primaryjoin="Pair.partner_id==Word.id", back_populates="pairs")





class Word(db.Model):

    __tablename__ = "words"

    id = db.Column(db.Integer, primary_key=True)
    word = db.Column(db.String(), nullable=False)

    # Relationships

    # "partners" refers to all words that this word has a pair (link) with
    partners = db.relationship(
        'Word',
        secondary="pairs",
        primaryjoin=id == Pair.word_id,
        secondaryjoin=id == Pair.partner_id,
        backref=db.backref('words')
    )
    # "pairs" is supposed to refer to all pairs that this word is a part of.
    pairs = db.relationship('Pair', primaryjoin=id ==
                        or_(Pair.word_id, Pair.partner_id))

我有这些模型。基本上我有单词和(单词)对,其中对由两个单词组成,并且还包含一些关于对类型的信息。在一对中,我需要两个不同的单词,每个单词都有自己的声音。这个声音是由单词与另一个单词的关系来定义的,所以 fx 在一对“pat”和“hat”中,“pat”有“p”,“hat”有“h”,因为这些声音构成了字。所以什么声音属于什么词很重要。但我不能只将声音放在 Word 表中,因为“pat”在链接到“pac”时具有不同的声音 (t)。

我已经尝试了很多东西并再次删除它们,但现在我只是希望有人能告诉我正确的方法。

帮助我,Stackoverflow。你是我唯一的希望。

标签: sqlalchemyflask-sqlalchemy

解决方案


推荐阅读