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

Python操作数据库的ORM框架SQLAlchemy快速入门教程

连接内存版SQLIte

from sqlalchemy import create_engineengine = create_engine('sqlite:///:memory:')
print(engine)

连接文件版SQLite

from sqlalchemy import create_engineengine = create_engine('sqlite:///sqlite3.db')
print(engine)

连接MySQL数据库

from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://root:zhangdapeng520@127.0.0.1:3306/fastzdp_sqlalchemy?charset=utf8')
print(engine)

根据模型自动创建表


import enum
from datetime import datetime
from decimal import Decimalimport sqlalchemy
from sqlalchemy import create_engine, DateTime, func, String
from sqlalchemy.orm import Mapped, DeclarativeBase, mapped_columnengine = create_engine('mysql+pymysql://root:zhangdapeng520@127.0.0.1:3306/fastzdp_sqlalchemy?charset=utf8')class BaseModel(DeclarativeBase):"""基础模型"""id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)create_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), comment="创建时间")update_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), onupdate=func.now(),comment="更新时间")class GenderEnum(enum.Enum):MALE = "男"FEMALE = "女"class Employee(BaseModel):"""员工模型,对应员工表"""__tablename__ = 'employee'name: Mapped[str] = mapped_column(String(36), index=True, nullable=False, comment="姓名")age: Mapped[int] = mapped_column(comment="年龄")salary: Mapped[Decimal] = mapped_column(sqlalchemy.DECIMAL, nullable=False, comment="薪资")bonus: Mapped[float] = mapped_column(sqlalchemy.FLOAT, default=0, comment="奖金")is_leave: Mapped[bool] = mapped_column(sqlalchemy.Boolean, default=False, comment="是否离职")gender: Mapped[GenderEnum] = mapped_column(sqlalchemy.String(6), default=GenderEnum.MALE, comment="性别")if __name__ == '__main__':BaseModel.metadata.drop_all(engine)BaseModel.metadata.create_all(engine)

通过session新增数据

with Session(engine) as session:session.begin()try:session.add(Employee(name="张三", age=23, salary=Decimal(30000),gender=GenderEnum.MALE.value))except:session.rollback()session.commit()

通过sessionmaker添加数据

with sessionmaker(engine).begin() as session:session.add(Employee(name="李四", age=23, salary=Decimal(30000), gender=GenderEnum.MALE.value))

批量新增数据

with sessionmaker(engine).begin() as session:employees = [Employee(name="张三1", age=23, salary=Decimal(30000), gender=GenderEnum.MALE.value),Employee(name="张三2", age=23, salary=Decimal(30000), gender=GenderEnum.MALE.value),Employee(name="张三3", age=23, salary=Decimal(30000), gender=GenderEnum.MALE.value),]session.add_all(employees)

根据ID查询

with sessionmaker(engine).begin() as session:employee = session.get(Employee, 1)print(employee.name)

查询所有的数据

with sessionmaker(engine).begin() as session:query = select(Employee)data = session.scalars(query).all()print(data)for employee in data:print(employee.name, employee.age)

查询指定字段


with sessionmaker(engine).begin() as session:query = select(Employee.id, Employee.name, Employee.age)data = session.execute(query).all()print(data)for employee in data:  # rowprint(employee.name, employee.age)

执行原生SQL语句进行查询


with sessionmaker(engine).begin() as session:query = sqlalchemy.text("select id,name,age from employee")data = session.execute(query).all()print(data)for employee in data:  # rowprint(employee.name, employee.age)

根据ID修改数据


with sessionmaker(engine).begin() as session:employee = session.get(Employee, 1)employee.name = "张三333"

执行update方法


with sessionmaker(engine).begin() as session:query = sqlalchemy.update(Employee).where(Employee.id == 1).values(name="张三", age=33)session.execute(query)

根据ID删除数据

with sessionmaker(engine).begin() as session:employee = session.get(Employee, 1)session.delete(employee)

执行delete方法

with sessionmaker(engine).begin() as session:query = sqlalchemy.delete(Employee).where(Employee.id == 2)session.execute(query)

执行is null查询

with sessionmaker(engine).begin() as session:query = select(Employee).where(Employee.salary.is_(None))  # is nullemployees = session.execute(query).scalars()print(employees)

执行is not null查询

with sessionmaker(engine).begin() as session:query = select(Employee).where(Employee.salary.isnot(None))  # is not nullemployees = session.execute(query).scalars()print(employees)for employee in employees:print(employee.name, employee.age, employee.salary, employee.bonus, employee.is_leave)

执行like模糊查询

with sessionmaker(engine).begin() as session:query = select(Employee).where(Employee.name.like("%3"))  # like 模糊查询employees = session.execute(query).scalars()print(employees)for employee in employees:print(employee.name, employee.age, employee.salary, employee.bonus, employee.is_leave)

执行in查询


with sessionmaker(engine).begin() as session:query = select(Employee).where(Employee.id.in_([3, 5]))  # in 查询employees = session.execute(query).scalars()print(employees)for employee in employees:print(employee.name, employee.age, employee.salary, employee.bonus, employee.is_leave)

执行or查询

with sessionmaker(engine).begin() as session:query = select(Employee).where(sqlalchemy.or_(Employee.age < 20, Employee.age > 30))  # or 查询employees = session.execute(query).scalars()print(employees)for employee in employees:print(employee.name, employee.age, employee.salary, employee.bonus, employee.is_leave)

求平均薪资

with sessionmaker(engine).begin() as session:query = select(func.avg(Employee.salary))avg = session.execute(query).first()print(avg)

统计表中的数据个数

with sessionmaker(engine).begin() as session:query = select(func.count(Employee.id))id_count = session.execute(query).first()print(id_count)

执行分页查询

with sessionmaker(engine).begin() as session:query = select(Employee).offset(2).limit(2)data = session.execute(query).scalars()for employee in data:print(employee.id, employee.name)

执行排序查询

with sessionmaker(engine).begin() as session:# query = select(Employee).order_by(Employee.age.desc()) # 降序query = select(Employee).order_by(Employee.age)  # 升序data = session.execute(query).scalars()for employee in data:print(employee.id, employee.name, employee.age)

执行分组聚合查询

with sessionmaker(engine).begin() as session:query = select(Employee.gender, func.count(Employee.id)).group_by(Employee.gender)data = session.execute(query).all()for row in data:print(row.gender, row.count)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 运维领域的先进思想和趋势
  • timm从本地加载预训练模型
  • Docker 容器编排之 Docker Compose
  • OpenHarmony鸿蒙开发( Beta5.0)智能手表应用开发实践
  • Unity【Colliders碰撞器】和【Rigibody刚体】的应用——小球反弹效果
  • C#读写锁与并发控制
  • 【第一章】-MATLAB Simulink概述
  • 展会回顾 | SunTorque智能扭矩系统亮相GAF2024展览会,收获满满
  • 【深度学习】卷积神经网络与 LeNet
  • WPF——自定义RadioButton
  • 使用pytorch深度学习框架搭建神经网络
  • 密码中的字符的判断,字母,数字,特殊字符等
  • CVE-2018-17066漏洞复现 Dlink命令注入漏洞
  • Spring01——Spring简介、Spring Framework架构、Spring核心概念、IOC入门案例、DI入门案例
  • 类和对象的概述以及this指针的应用
  • [case10]使用RSQL实现端到端的动态查询
  • Angular 4.x 动态创建组件
  • Angular 响应式表单 基础例子
  • Effective Java 笔记(一)
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Node 版本管理
  • PHP 的 SAPI 是个什么东西
  • Python进阶细节
  • Solarized Scheme
  • SpringBoot 实战 (三) | 配置文件详解
  • 初识 webpack
  • 对超线程几个不同角度的解释
  • - 概述 - 《设计模式(极简c++版)》
  • 构建工具 - 收藏集 - 掘金
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 一文看透浏览器架构
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 说说我为什么看好Spring Cloud Alibaba
  • ​io --- 处理流的核心工具​
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #Z2294. 打印树的直径
  • $L^p$ 调和函数恒为零
  • (3)llvm ir转换过程
  • (9)STL算法之逆转旋转
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (离散数学)逻辑连接词
  • (顺序)容器的好伴侣 --- 容器适配器
  • (算法)N皇后问题
  • (图)IntelliTrace Tools 跟踪云端程序
  • (五)Python 垃圾回收机制
  • (循环依赖问题)学习spring的第九天
  • (一)SpringBoot3---尚硅谷总结
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • .net 流——流的类型体系简单介绍