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()
    

     

 

 

發佈了59 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章