2017-06-30 25 views
0

我有一个组织模型:与SQLAlchemy的防止父删除backref

class Organization(SharedModel): 
    name = db.Column(db.String(200), nullable=False) 

和几个模型backref Organization这样的:

class OrganizationBusinessLine(db.Model): 
    organization_id = db.Column(db.Integer, db.ForeignKey('organization.id'), nullable=False) 
    organization = db.relationship('Organization', foreign_keys=[organization_id], 
           single_parent=True, 
           backref=db.backref('businessLines', uselist=True)) 

    name = db.Column(db.String(200), nullable=False) 

Organization被删除,我希望所有OrganizationBusinessLine s是与组织有关的删除,并且这工作得很好:

def test_that_children_of_organization_are_deleted(session) 
    organization_id = 1 
    organization = session.query(Organization).get(organization_id) 
    business_line_ids = [instance.id for instance in 
         session.query(OrganizationBusinessLine).filter_by(organization=organization).all()] 

    db.session.delete(instance) 
    db.session.commit() 
    for instance_id in business_line_ids: 
     assert session.query(OrganizationBusinessLine).get(instance_id) is None 

但是当我删除一个业务线,相关的机构也被删除:

def test_that_parent_is_not_deleted(session): 
    business_line = session.query(OrganizationBusinessLine).first() 

    business_line_id = business_line.id 
    organization_id = business_line.organization_id 

    OrganizationBusinessLine.delete(business_line_id) 

    assert session.query(OrganizationBusinessLine).get(business_line_id) is None 
    assert session.query(Organization).get(organization_id) is not None # Fails 

我曾尝试在backref几个不同cascade= -options,但我不能让“父”(Organization)至不被删除。

默认cascade=选项backrefs是according to the docs

级联的默认行为仅限于所谓的保存,更新和合并设置级联。

我希望这些设置甚至不会删除“子”对象,但似乎这样做。

我正在我的本地SQLite数据库上运行测试,如果这很重要。

+0

请张贴OrganizationBusinessLine.delete'的'定义。 –

回答

0

使用父类的关系,并引用父外键与ondelete = CASCADE

class Organization(SharedModel): 
    name = db.Column(db.String(200), nullable=False) 
    businneslines = relationship(
     'Component', 
     backref=backref("organization"), 
     cascade="all,delete" 
    ) 

class OrganizationBusinessLine(db.Model): 
    organization_id = db.Column(db.Integer, 
           db.ForeignKey('organization.id'), 
           nullable=False) 
    organization_id = Column(
     Integer, 
     ForeignKey('organization.id', ondelete='CASCADE'))