如何为具有复合主键的表建立外键?
我在弄清楚如何正确设置我定义的表中的外键列时遇到了很多麻烦。我在这里列出了我的模型,并在我的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'))