簡體   English   中英

flask中的多個外鍵SqlAlchemy連接錯誤

[英]Multiple Foreign key SqlAlchemy join error in flask

我有兩節課。 一個機構可以有多個學生。 因此,我有兩個類,如下所示:

class University(db.Model):
    country = db.Column(db.String(120), primary_key=True)
    name = db.Column(db.String(120), primary_key=True)
    students = db.relationship('Student', backref='phd_granting_university', lazy='dynamic')

class Student(db.Model):
    name = db.Column(db.String(120), primary_key=True)
    phd_graduation_year = db.Column(db.Integer, primary_key=True)
    phd_granting_university_name = db.Column(db.String(120), db.ForeignKey('university.name'), primary_key=True)
    phd_granting_university_country = db.Column(db.String(120), db.ForeignKey('university.country'), primary_key=True)

我收到以下錯誤:

無法確定關系 University.students 上的父/子表之間的連接條件 - 有多個外鍵路徑鏈接這些表。 指定“foreign_keys”參數,提供那些列的列表,這些列應該被視為包含對父表的外鍵引用。

必須在表級別聲明復合外鍵。 為了在 SQLAlchemy 的 ORM 中做到這一點,約束在__table_args__屬性中聲明:

class Student(db.Model):
    name = db.Column(db.String(120), primary_key=True)
    phd_graduation_year = db.Column(db.Integer, primary_key=True)
    phd_granting_university_name = db.Column(db.String(120), primary_key=True)
    phd_granting_university_country = db.Column(db.String(120), primary_key=True)

    __table_args__ = (
        db.ForeignKeyConstraint(
            [phd_granting_university_name, phd_granting_university_country],
            ['university.name', 'university.country'],
        ),
    )

這將生成這個 DDL:

CREATE TABLE students (
        name VARCHAR(120) NOT NULL, 
        phd_graduation_year INTEGER NOT NULL, 
        phd_granting_university_name VARCHAR(120) NOT NULL, 
        phd_granting_university_country VARCHAR(120) NOT NULL, 
        PRIMARY KEY (name, phd_graduation_year, phd_granting_university_name, phd_granting_university_country), 
        FOREIGN KEY(phd_granting_university_name, phd_granting_university_country) REFERENCES university (name, country)
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM