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

连接内存版SQLIte

python 复制代码
from sqlalchemy import create_engine

engine = create_engine('sqlite:///:memory:')
print(engine)

连接文件版SQLite

python 复制代码
from sqlalchemy import create_engine

engine = create_engine('sqlite:///sqlite3.db')
print(engine)

连接MySQL数据库

python 复制代码
from sqlalchemy import create_engine

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

根据模型自动创建表

python 复制代码
import enum
from datetime import datetime
from decimal import Decimal

import sqlalchemy
from sqlalchemy import create_engine, DateTime, func, String
from sqlalchemy.orm import Mapped, DeclarativeBase, mapped_column

engine = 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新增数据

python 复制代码
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添加数据

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

批量新增数据

python 复制代码
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查询

python 复制代码
with sessionmaker(engine).begin() as session:
    employee = session.get(Employee, 1)
    print(employee.name)

查询所有的数据

python 复制代码
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)

查询指定字段

python 复制代码
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:  # row
        print(employee.name, employee.age)

执行原生SQL语句进行查询

python 复制代码
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:  # row
        print(employee.name, employee.age)

根据ID修改数据

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

执行update方法

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

根据ID删除数据

python 复制代码
with sessionmaker(engine).begin() as session:
    employee = session.get(Employee, 1)
    session.delete(employee)

执行delete方法

python 复制代码
with sessionmaker(engine).begin() as session:
    query = sqlalchemy.delete(Employee).where(Employee.id == 2)
    session.execute(query)

执行is null查询

python 复制代码
with sessionmaker(engine).begin() as session:
    query = select(Employee).where(Employee.salary.is_(None))  # is null
    employees = session.execute(query).scalars()
    print(employees)

执行is not null查询

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

执行like模糊查询

python 复制代码
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查询

python 复制代码
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查询

python 复制代码
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)

求平均薪资

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

统计表中的数据个数

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

执行分页查询

python 复制代码
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)

执行排序查询

python 复制代码
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)

执行分组聚合查询

python 复制代码
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)
相关推荐
王志来137944730085 分钟前
聚焦五大核心场景:工控服务器机箱平台的垂直深耕之路
运维·服务器·python
zmzb010312 分钟前
Python课后习题训练记录Day193
开发语言·python
卷无止境13 分钟前
LiteLLM 全面解析开源AI网关如何统一管理百余种大模型
后端·python
隔窗听雨眠22 分钟前
MySQL索引机制深度解析:从B+树原理到高并发查询优化的完整指南
数据库·b树·mysql
数智化管理手记23 分钟前
数据质量无法保障?自动化数据质量规则校验如何搭建方案?
大数据·数据库·自动化
我的xiaodoujiao34 分钟前
使用PyMySQL模块技术操作MySQL数据库
数据库·python·测试工具·mysql
卷无止境1 小时前
终端里的AI辅助,一场正在发生的编程效率变革
后端·python
苏灿烤鱼1 小时前
上下文写成文件系统,为什么向量还能静默丢?
python·github·agent
SamChan902 小时前
对比 4 种主流 PDF 文档解析方案:PyMuPDF vs pdfplumber vs Apache PDFBox vs 大模型 OCR
python·ai·pdf·ocr·apache·机器翻译
zmzmzmalo4 小时前
Linux ELF文件加载与内存管理揭秘
linux·网络·数据库