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 comm
comm = 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 self
user.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="作品删除成功!")
当删除作品时,能自动将作品-类别表里对应的数据删除