文章内容

2022/3/1 19:11:39,作 者: 黄兵

SQLAlchemy 级联删除示例

最近在使用 SQLAlchemy 新建模型的时候,用到了级联删除,下面是示例代码:

# 文章类别
class CycleBlogCategory(db.Model):
__tablename__ = 'cycle_categories'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
link_text = db.Column(db.String(128), unique=True, index=True)
menu_id = db.Column(db.SmallInteger, db.ForeignKey('cycle_menus.id'))
blogs = db.relationship('CycleArticle', backref='cycle_categories', lazy='dynamic')


# 菜单
class CycleMenu(db.Model):
__tablename__ = 'cycle_menus'
id = db.Column(db.SmallInteger, primary_key=True)
name = db.Column(db.String(16), unique=True)
menu_rank = db.Column(db.SmallInteger)
# 使用级联删除
categories = db.relationship('CycleBlogCategory', backref='cycle_menus', cascade="all, delete", lazy='dynamic')

上面菜单(父)和文章类别(子)关系,我们在“父”上设置删除。

下面是测试用例:

def test_menu_delete(self):
u = CycleMenu(name='网络设备回收')
db.session.add(u)
db.session.commit()
c = CycleBlogCategory(name='Cisco 交换机', link_text='cisco', menu_id=u.id)
db.session.add(c)
db.session.commit()
query_menu = CycleMenu.query.filter_by(name='网络设备回收').first()
db.session.delete(query_menu)
db.session.commit()
query_category = CycleBlogCategory.query.first()
self.assertFalse(query_category)

测试通过。


参考资料:

1、SQLAlchemy 1.4 Documentation - Cascades


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - SQLAlchemy 级联删除示例

分享到:

发表评论

评论列表