父母有多个外键的孩子?

时间:2016-12-02 10:26:29

标签: python sql python-3.x sqlalchemy foreign-keys

我的公司有国家/地区代码,商家ID和员工列表:

class Company(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    business_id = db.Column(db.String(20), nullable=False)
    country_code = db.Column(db.String(2), nullable=False)
    employee = db.relationship('Employee', backref='company')

class Employee(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    company_id = db.Column(db.Integer, db.ForeignKey('company.id'))

但是说数据变化很明显,同一家公司的id并不总是相同的(公司可能会从数据库中删除,然后在不同的id重新添加)。但是,country_codebusiness_id的组合总是保证既是唯一的,也是同一家公司的常量。

如何为Employee的{​​{1}} Companycountry_code创建两个外键?

我尝试通过较旧的StackOverflow问题执行此操作,但它引发了一个错误,business_id不应该使用:

'str'

然而,Python的语法阻止我引用类本身。

1 个答案:

答案 0 :(得分:1)

我不确定你究竟是在问什么,但下面的代码示例做了两件事,我认为这会有所帮助:

  1. 定义复合外键
  2. 指明用于CompanyEmployee
  3. 之间关系的外键

    型号:

    class Company(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        business_id = db.Column(db.String(20), nullable=False)
        country_code = db.Column(db.String(2), nullable=False)
        name = db.Column(db.String(), nullable=False)
    
        employee = db.relationship(
            'Employee', backref='company',
            # 2. indicate FK to use below
            foreign_keys=lambda: [Employee.business_id, Employee.country_code],
            # foreign_keys=lambda: Employee.company_id,
        )
    
    
    class Employee(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        company_id = db.Column(db.ForeignKey('company.id'))
        name = db.Column(db.String(), nullable=False)
    
        business_id = db.Column(db.String(20), nullable=False)
        country_code = db.Column(db.String(2), nullable=False)
    
        # 1. define a composite foreign key
        __table_args__ = (
            db.ForeignKeyConstraint(
                ['business_id', 'country_code'],
                ['company.business_id', 'company.country_code']
            ),
        )