【问题标题】:Child with multiple foreign keys to parent?孩子与父母有多个外键?
【发布时间】:2017-04-17 05:32:18
【问题描述】:

我的公司有一个国家代码、一个公司 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 的组合始终保证是唯一的,并且对于同一家公司来说是不变的。

如何为指向Companycountry_codebusiness_idEmployee 创建两个外键?

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

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', foreign_keys=['Company.business_id', 'Company.country_code'])

但是,Python 的语法阻止我引用类本身。

【问题讨论】:

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


    【解决方案1】:

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

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

    型号:

    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']
            ),
        )
    

    【讨论】:

    • 我不知道所有表格参数等的确切含义,但它似乎完全按照我想要的方式工作。谢啦! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2014-05-17
    • 1970-01-01
    相关资源
    最近更新 更多