Tornado+SQLalchemy(二) 设置表的级联删除

目的:通过接收外键值,可以实现一对多或多对多数据删除

 

过程:

  1. 表的设计
     
    # 主表只需要设置所需字段
    class UserInfo(Base):
        __tablename__ = 'base_userinfo'
    
        ID = Column(Integer, primary_key=True, autoincrement=True)
        worknum = Column(String(15), unique=True, comment='工号(唯一)')
        UserName = Column(String(45))
        IsDelete = Column(Boolean)
    
    
    # 附表 需要 定义外键、 级联关系:relationship
    class CardInfo(Base):
        __tablename__ = 'base_cardinfo'
        ID = Column(Integer, primary_key=True, autoincrement=True)
        Cardnum = Column(String(15), nullable=True, comment='卡号(唯一)')
         #关联哪张表的什么字段
        Uid = Column(Integer, ForeignKey("base_userinfo.ID"))
        # 将UserInfo 和  base_cardinfo 关联     backref表示反向关联
        u = relationship("UserInfo", backref=backref("base_cardinfo", cascade='all,delete'))
    
  2. 使用方式
     
    import create_db, drop_db, UserInfo, Parent #根据自己项目路径导入
    
    class UserHandler(BaseHandler):
        def get(self):
            #session_maker() 将数据库会话封装成上下文形式,所以我们直接这么使用
            with session_maker() as session:
                res = session.query(UserInfo).filter(UserInfo.ID == 1).first().to_dict()
                print(res)
    
        def delete(self):
            with session_maker() as session:
                # 先查数据
                r = session.query(UserInfo).filter(UserInfo.ID == 1).first()
    
                # r = session.query(Parent).first()
    
                #在通过会话删除数据
                res = session.delete(r)
                print(res)
            self.write({'data': res})

     

  3.  session上下文封装
     
    from contextlib import contextmanager
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker
    
    #以下两种连接方式都行
    # db_url = 'mysql+pymysql://root:@127.0.0.1:3307/tornado9'
    #下面这种连接方式要安装  mysql-connector-pyhton库,不然会报错
    db_url = 'mysql+mysqlconnector://root:@127.0.0.1:3307/tornado9'
    
    # 创建数据库连接
    engine = create_engine(db_url)
    
    # 模型与数据库表进行关联的基类,模型必须继承Base
    Base = declarative_base(bind=engine)
    
    # 创建session会话
    DBSession = sessionmaker(bind=engine)
    s = DBSession()
    
    
    # 使用上下文管理器封装session的建立和关闭
    @contextmanager
    def session_maker(session=s):
        try:
            yield session
            session.commit()
        except:
            session.rollback()
            raise
        finally:
            session.close()
    

     

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值