如何为具有复合主键的表建立外键?

4 投票
1 回答
529 浏览
提问于 2025-04-17 18:12

我在弄清楚如何正确设置我定义的表中的外键列时遇到了很多麻烦。我在这里列出了我的模型,并在我的PhoneNumber模型中标出了有问题的那一行:

class AreaCode(db.Model):
    __tablename__ = 'areacodes'
    area_code = db.Column(db.Integer, primary_key=True)
    exchanges = db.relationship('Exchanges', backref='area_code')


class Exchange(db.Model):
    __tablename__ = 'exchanges'
    exchange = db.Column(db.Integer, primary_key=True)
    area_code_pk = db.Column(db.Integer, db.ForeignKey('areacodes.area_code'), primary_key=True)


class PhoneNumber(db.Model):
    __tablename__ = 'phonenumbers'
    phone_number = db.Column(db.Numeric(precision=4, scale=0), primary_key=True)
    exchange_pk = db.Column(db.Integer, db.ForeignKey('exchanges.exchange'), primary_key=True) # this doesnt work since Exchange has two primary keys

事情是这样的:

我的Exchange表有一个复合主键。这是我使用场景所必需的。

我想定义的PhoneNumber表需要一个指向Exchange表的外键,但由于Exchange表有复合主键,我不知道该如何让这个关系正常工作。

如果能给点建议就太好了。谢谢。

1 个回答

2

所以,在和几个很棒的人在sqlalchemy邮件列表上交流后,我终于搞清楚了上面的问题。下面是我代码的最终版本,它让我能够正确地在表之间建立关系:

class AreaCode(db.Model):
    __tablename__ = 'areacodes'

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


class Exchange(db.Model):
    __tablename__ = 'exchanges'

    exchange = db.Column(db.Integer, primary_key=True)
    area_code_pk = db.Column(db.Integer, db.ForeignKey('areacodes.area_code'),
                             primary_key=True)
    area_code = db.relationship('AreaCode', backref=db.backref('exchanges', lazy='dynamic'))


class PhoneNumber(db.Model):
    __tablename__ = 'phonenumbers'
    __table_args__ = (
        db.ForeignKeyConstraint(
            ['exchange_exchange', 'exchange_area_code_pk'],
            ['exchanges.exchange', 'exchanges.area_code_pk'],
        ),
    )

    phone_number = db.Column(db.Integer, primary_key=True)
    exchange_exchange = db.Column(db.Integer, primary_key=True)
    exchange_area_code_pk = db.Column(db.Integer, primary_key=True)
    exchange = db.relationship('Exchange', backref=db.backref('phone_numbers', lazy='dynamic'))

撰写回答