目的:通過接收外鍵值,可以實現一對多或多對多數據刪除
過程:
- 表的設計
# 主表只需要設置所需字段 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'))
- 使用方式
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})
- 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()