4

定義しているテーブルの ForeignKey 列を適切に構築する方法を理解するのに苦労しています。ここでモデルの概要を説明しました (そして、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 テーブルへの ForeignKey が必要ですが、Exchange テーブルには複合主キーがあるため、関係を機能させる方法がわかりません。

任意のガイダンスをいただければ幸いです。ありがとうございました。

4

1 に答える 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'))
于 2013-03-09T20:51:21.947 に答える