ORM操作(flask)

发布于:2025-03-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

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="作品删除成功!")

当删除作品时,能自动将作品-类别表里对应的数据删除
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到