当前位置: 首页 > article >正文

ORM操作(flask)

目录

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

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

在这里插入图片描述


http://www.kler.cn/a/590359.html

相关文章:

  • 基于SpringBoot + Vue 的心理健康系统
  • Matlab自学笔记四十八:各类型缺失值的创建、判断、替换、移位和处理方法
  • Spring Boot 核心知识点:依赖注入 (Dependency Injection)
  • 轻量级、高性能的 Rust HTTP 服务器库 —— Hyperlane
  • Spring Cloud 负载均衡(Ribbon)- 流量管理与服务调用优化
  • C++从入门到入土(八)——多态的原理
  • 冒泡排序:古老算法中的智慧启示
  • 「Java EE开发指南」如何用MyEclipse构建一个Web项目?(二)
  • Zabbix7.0+DeepSeek大模型实现人工智能告警分析
  • 鸿蒙路由 HMRouter 配置及使用 二
  • WebSocket与MQTT协议深度对比:选择合适的通信协议
  • 如何用Python批量将CSV文件编码转换为UTF-8并转为Excel格式?
  • 技术与情感交织的一生 (一)
  • 现代密码学 | 具有数字签名功能的安全方案
  • Spring MVC 全面解析:架构、流程与核心组件(详细)
  • spring bean的生命周期和循环依赖
  • 【零基础入门unity游戏开发——unity2D篇】2D射线和范围检测之Physics2D Raycast、OverlapCircle、OverlapBox
  • golang函数与方法的区别
  • K8S快速部署
  • 新闻发布时间抽取分析