【问题标题】:Referencing composite index as a foreign key of another table引用复合索引作为另一个表的外键
【发布时间】:2020-01-03 23:32:54
【问题描述】:

我在部门表中有一个复合索引,并希望将此列(唯一的)引用为员工表中的外键。问题是flask migrate不识别复合索引?

部门表:

class Department(db.Model):
    __tablename__ = "departments"

    id = db.Column(db.Integer, primary_key=True)
    dep_name = db.Column(db.String(250), nullable=False)

    employees = db.relationship('Employee',
                                   backref='department',
                                   lazy='dynamic')

    __table_args__ = (
        db.Index('dep_name_id', id, dep_name),
        db.UniqueConstraint(id, dep_name),
    )

员工表:

class Employee(db.Model):
    __tablename__ = "employees"

    someinfo = db.Column(db.String(ID_LEN), primary_key=True)
    department_id = db.Column(db.String(500), db.ForeignKey('departments.dep_name_id'))

但是在运行flask db migrate 之后,我收到以下错误(无法识别复合索引列!):

sqlalchemy.exc.NoReferencedColumnError: Could not initialize target column for ForeignKey 'deparments.dep_name_id' on table 'employees': 
table 'departments' has no column named 'dep_name_id'

【问题讨论】:

  • dep_name_id 不是列,是索引,所以不能在 DDL 级别引用。此外,我认为你应该只使用 department.id 作为 FK 并通过关系创建任何你想要的东西。
  • 好的,这是有道理的。我仍然想将两列引用为 FK。我该怎么做?
  • 抱歉,回复晚了,

标签: python indexing sqlalchemy foreign-keys


【解决方案1】:

首先将deb_name进行PK:

class Department(db.Model):
    ...
    dep_name = db.Column(db.String(250), nullable=False, primary_key=True)
    ...

之后你可以在Employee模型上创建department_name FK:

class Employee(db.Model):
    ...
    department_id = db.Column(db.String(500), db.ForeignKey('departments.dep_id'))
    department_name = db.Column(db.String(500), db.ForeignKey('departments.dep_name'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多