【问题标题】:Multiple Foreign key SqlAlchemy join error in flask烧瓶中的多个外键SqlAlchemy连接错误
【发布时间】:2022-01-22 21:43:54
【问题描述】:

我有两节课。一个机构可以有多个学生。因此,我有两个类,如下所示:

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”参数, 提供应计为的那些列的列表 包含对父表的外键引用。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    复合外键必须是declared at the table level。为了在 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)
    )
    

    【讨论】:

      猜你喜欢
      • 2016-09-06
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 2016-11-14
      • 1970-01-01
      相关资源
      最近更新 更多