目的:通过接收外键值,可以实现一对多或多对多数据删除
过程:
- 表的设计
# 主表只需要设置所需字段 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()