当前位置: 首页 > 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)
http://www.lryc.cn/news/430694.html

相关文章:

  • 提交MR这个词儿您知道是什么意思吗?
  • Linux sentinel写法
  • 顶级域名服务器 - TLD服务器
  • 【LeetCode】01.两数之和
  • 便宜好用的云手机盘点
  • pdf怎么压缩小一些?推荐的几种PDF压缩方法
  • Linux终端简单配置(Vim、oh-my-zsh和Terminator)
  • js模块化 --- commonjs规范 原理详解
  • kubeadm部署 Kubernetes(k8s) 高可用集群【V1.28 】
  • 【MySQL】MySQL Workbench下载安装、环境变量配置、基本MySQL语句、新建Connection
  • CrowdStrike 的失败如何凸显了左移测试的重要性
  • HarmonyOS开发实战( Beta5版)高负载组件的渲染实践规范
  • NLP从零开始------16.文本中阶处理之序列到序列模型(1)
  • 【匈牙利汽车产业考察,开启新机遇】
  • 并行程序设计基础——动态进程管理
  • C# 字符串(String)使用教程
  • django之ForeignKey、OneToOneField 和 ManyToManyField
  • java.lang.IndexOutOfBoundsException: setSpan ( 0...x ) ends beyond length X
  • 技术进展:CH-90树脂在去除硫酸钠柠檬酸钠溶液中铁锰离子上的应用
  • 录屏时摄像头无法识别?如何录屏时打开摄像头,解决方案及录屏软件推荐
  • 达梦数据库-DM8 企业版安装指南
  • 心脑血管科董田林医生:心律失常患者饮食,调养秘诀,助你找回健康心跳
  • 期权杂记(一)
  • 【MATLAB源码-第163期】基于matlab的BPSK+瑞利(rayleigh)信道下有无波束成形误码率对比仿真。
  • 【数据分享】2000-2022年我国省市县三级的逐日O3数据(免费获取\excel\shp格式)
  • Python 的http.server库详细介绍
  • 使用ffmpeg在视频中绘制矩形区域
  • 计算机,数学,AI在社会模拟中的应用
  • 【数据结构】排序算法系列——插入排序(附源码+图解)
  • TOMATO靶机漏洞复现