目录
- ORM操作
- 增
- 删
- 改
- 查
- 连表操作
ORM操作
增
# 1. 创建ORM对象
user = User(username="test", password="123456", email="123@qq.com")
# 2. 将ORM对象添加到db.session数据库会话中
db.session.add(user)
# 提交会话,将db.session中的改变同步到数据库
db.session.commit()
封装成类方法:
@classmethod
def create_comm(cls, content, user_id, work_id): comm = Comment(content=content, user_id=user_id, work_id=work_id) db.session.add(comm) db.session.commit() return commcomm = Comment.create_comm(content, user_id, work_id)
删
db.session.delete(user)
db.session.commit()
封装成实例方法:
def del_work(self): db.session.delete(self) db.session.commit()work = db.session.query(Work).get(work_id)
if not work: return error_response("作品不存在!")
work.del_work()
改
user.name = new_name
db.session.commit()
封装成实例方法:
def update_username(self, new_name): self.username = new_name db.session.commit() return selfuser.update_username(new_name)
查
# 根据主键查询,返回一个对象
user = User.query.get(user_id)
user = db.session.query(User).get(user_id)# 根据某一字段查询,返回一个对象
user = db.session.query(User).filter_by(username="test").first()# 列出表里所有数据,返回一个列表
works = db.session.query(Work).all()# 查询符合条件的数据数量
total_count = db.session.query(Work).filter(Work.title.contains("test")).count()
封装成类方法:
# 类方法
@classmethod
def get_work_by_title(cls, title): return cls.query.filter(cls.title.contains(title)).all()works = Work.get_work_by_title(title)
连表操作
定义作品表
class Work(db.Model): # 定义表名 __tablename__ = "work" # 定义关键字 # 关键字=db.Column(数据类型(长度),primary_key是否主键,autoincrement是否自增,nullable是否可以为空) work_id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text) # 添加作者的外键 author_id = db.Column(db.Integer, db.ForeignKey("user.user_id")) # backref会自动给User模型添加一个works的属性,用来获取文章列表,另一张表就不需要写此配置 author = db.relationship("User", backref="works") # 设置发布时间 pub_date = db.Column(db.DateTime, default=datetime.now)
定义类别表,以及作品-类别中间表
work_category = db.Table('work_category', db.Column('cate_id', db.Integer, db.ForeignKey('category.cate_id'), primary_key=True), db.Column('work_id', db.Integer, db.ForeignKey('work.work_id'), primary_key=True)
) class Category(db.Model): __tablename__ = "category" cate_id = db.Column(db.Integer, primary_key=True, autoincrement=True) cate_name = db.Column(db.String(200), nullable=False, unique=True) # 关联work表,删除work时会将work_category表里的对应数据删除 works = db.relationship('Work', secondary=work_category, backref='categories') def get_works_by_category_id(self): return self.works def get_work_count(self): return len(self.works)
根据类别查询作品
category = db.session.query(Category).get(category_id)
works = category.get_works_by_category_id()
total = category.get_work_count()
作品类下面加一个删除功能的实例方法
class Work(db.Model): # 定义表名 __tablename__ = "work" # 定义关键字 # 关键字=db.Column(数据类型(长度),primary_key是否主键,autoincrement是否自增,nullable是否可以为空) work_id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text) # 添加作者的外键 author_id = db.Column(db.Integer, db.ForeignKey("user.user_id")) # backref会自动给User模型添加一个works的属性,用来获取文章列表,另一张表就不需要写此配置 author = db.relationship("User", backref="works") # 设置发布时间 pub_date = db.Column(db.DateTime, default=datetime.now)def del_work(self): db.session.delete(self) db.session.commit()
删除接口
@work_bp.route("/del/<int:work_id>", methods=['DELETE'])
@login_reqired
def work_del(work_id): work = db.session.query(Work).get(work_id) if not work: return error_response("作品不存在!") work.del_work() data = {"work_id": work_id} return generate_response(data=data, message="作品删除成功!")
当删除作品时,能自动将作品-类别表里对应的数据删除