Flask Sqlalchemy 的级联删除配置

import sqlalchemy
from MockServer import db


class Base:

    id = db.Column(db.Integer, primary_key=True)
    created_at = db.Column(db.DateTime, default=sqlalchemy.func.now(), nullable=False)
    updated_at = db.Column(db.DateTime, default=sqlalchemy.func.now(), onupdate=sqlalchemy.func.now(), nullable=False)

    # 添加一条数据
    def save(self):
        try:
            db.session.add(self)
            db.session.commit()
        except BaseException:
            db.session.rollback()

    # 添加多条数据
    def save_all(self, *args):
        try:
            db.session.add_all(args)
            db.session.commit()
        except BaseException:
            db.session.rollback()

    # 删除数据
    def delete(self):
        try:
            db.session.delete(self)
            db.session.commit()
        except BaseException:
            db.session.rollback()

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysqlconnector://USERNAME:PASSWORD@HOSTNAME/DB'

db = SQLAlchemy(app, model_class=Base)

##################################################################################

class Project(Base, db.Model):
    name = db.Column(db.String(50), unique=True, nullable=False)
    desc = db.Column(db.String(100))
    api = db.relationship('Api', backref='project', cascade="all,delete")
    ###  只删除父级,子不影响
    # api = db.relationship('Api', backref='project',  passive_deletes=True)

    ###  子级跟随删除
    # 2. api = db.relationship('Api', backref='project', cascade="all, delete-orphan")
    # 3. api = db.relationship('Api', backref='project', cascade="all, delete")

    ##  父级删除,子级不删除,外键更新为 null
    # 4. api = relationship("Api", backref = backref("child"))


    def __init__(self, name='None', desc=''):
        self.name = name
        self.desc = desc

    def __repr__(self):
        return self.name + "......" + self.desc


class Api(Base, db.Model):
    method = db.Column(db.String(10), nullable=False)
    name = db.Column(db.String(50), nullable=False)
    url = db.Column(db.String(100), nullable=False, unique=True)
    body = db.Column(db.TEXT, nullable=False)
    project_id = db.Column(db.Integer, db.ForeignKey('project.id'))

    def __init__(self, method='', name='', url='', body='', project_id=1000):
        self.method = method
        self.name = name
        self.url = url
        self.body = body
        self.project_id = project_id

    def __repr__(self):
        return self.name + "......" + self.url

if __name__ == '__main__':
    db.create_all()
    Project.create(name='ZhangTian',desc='')
    Api.create(method='post',name='LiTian',url='',body='',project_id=1)


    project= db.session.query(Project).first()
    db.session.delete(project)
    db.session.commit()

参考:https://www.v2ex.com/t/507065

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值