Python 如何为具有复合主键的表构建ForeignKey?

Python 如何为具有复合主键的表构建ForeignKey?,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我在为定义的表正确构建ForeignKey列方面遇到了很多困难。我在这里概述了我的模型(并在我的电话号码模型中有问题的一行旁边放了一条评论): 下面是正在发生的事情: 我的Exchange表有一个复合主键。这是我的用例所必需的 我试图定义的PhoneNumber表需要交换表的ForeignKey,但由于交换表有一个复合主键,我无法确定如何使关系工作 任何指导都将不胜感激。谢谢。因此,在与sqlalchemy邮件列表上的几位杰出人士交谈后,我终于解决了上述问题。下面是我的代码的最终版本,允许我在表

我在为定义的表正确构建ForeignKey列方面遇到了很多困难。我在这里概述了我的模型(并在我的电话号码模型中有问题的一行旁边放了一条评论):

下面是正在发生的事情:

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

我试图定义的PhoneNumber表需要交换表的ForeignKey,但由于交换表有一个复合主键,我无法确定如何使关系工作


任何指导都将不胜感激。谢谢。

因此,在与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'))

在您的示例中,Exchange只有一个主键?
exchange
列是否也应该是
primary=True
?有几件事值得一看:还有,你在使用什么数据库?嗨@shazow,你说得对,我在那里打错了。Exchange有两个主键。另外,我使用的是PostgreSQL 9.2。您能澄清一下“无法理解如何使关系正常工作”是什么意思吗?你试过什么?您是否在
关系中指定了
外键
?或者,您可以指定
primaryjoin
条件。@rdeges:我已经编辑了这个问题,关于术语。当您与SQL炼金术人员聊天时,他们是否指定了为什么要在表上设置外键约束,以及为什么不直接在两列
exchange\u exchange
exchange\u area\u code\u pk
上设置外键约束?不幸的是,@Carel,这是我7年前写的代码,我真的不确定。我试着在我的收件箱中搜索,但找不到这个帖子——我怀疑它是在我现在的邮箱之前的另一个邮箱上,我再也无法访问它了。抱歉:(感谢您在@rdegg上付出了这么多的努力,我真的很感激。我再次学习了SQL炼金术,它指出这是在两个表之间设置复合外键的唯一方法。现在还有一篇文章对此进行了深入探讨
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'))