Python Sqlalchemy学习——查询操作集合

文章目录


前言

学习Python语法做的练习代码,记录同时也供大家参考,相互学习

一、装包指令

pip install "sqlalchemyasyncio" aiomysql

二、main.py示例代码

python 复制代码
from sqlalchemy import String, Float, DateTime, select,func
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from datetime import datetime
import asyncio

from sqlalchemy.sql.elements import and_

"""
初始化异步引擎
"""

# 1、定义连接字符串
connectionString = "mysql+aiomysql://root:xxx@localhost:3306/xxx?charset=utf8"

# 2、创建异步引擎
asyncEngine = create_async_engine(
    connectionString,
    echo=True,
    pool_size=10,
    max_overflow=20
)

# 3、声明实体模型类
"""
模型基类
"""
class MyBaseModel(DeclarativeBase):
    CreateDatetime: Mapped[datetime] = mapped_column(DateTime, default=datetime.now(), comment="CreateDate")


class Book(MyBaseModel):
    __tablename__ = "book"

    Id: Mapped[str] = mapped_column(String(50), primary_key=True, comment="ID")
    Title: Mapped[str] = mapped_column(String(50), nullable=True, comment="Title")
    Author: Mapped[str] = mapped_column(String(20), nullable=True, comment="Author")
    Price: Mapped[float] = mapped_column(Float, nullable=True, comment="Price")

# 4、初始数据库
async def initDatabase():
    async with asyncEngine.begin() as conn:
        await conn.run_sync(MyBaseModel.metadata.create_all)


# 5、创建异步会话工厂
AsyncSessionLocal=async_sessionmaker(
    bind=asyncEngine,
    class_=AsyncSession,
    expire_on_commit=False
)

# 6、获取数据库会话
async def getDatabase():
    async with AsyncSessionLocal() as session:
        try:
            yield session
            await session.commit()
        except Exception:
            await session.rollback()
        finally:
            await session.close()


"""
7、 实体模型操作
"""
# 获取所有书籍信息
async def queryBooks():
    async with AsyncSessionLocal() as session:
        result=await session.execute(select(Book))
        return result.scalars().all()

# 获取第一本书
async def queryFirstBook():
    async with AsyncSessionLocal() as session:
        result=await session.execute(select(Book))
        return result.scalars().first()

# 根据id获取书籍
async def queryBookById(id):
    async with AsyncSessionLocal() as session:
        return await session.get(Book, id)



# 条件筛选查询
# 比较判断 ==;>;<;>=;<=
# 模糊匹配 like()   Book.Title.like("西游%")
# 与非查询 &;|;~    (Book.Author=="曹雪芹")&(Book.Price>50)
# 包含查询 in_()
async def queryBooksByPrice(price):
    async with AsyncSessionLocal() as session:
        result=await session.execute(select(Book).where(Book.Price>50))
        return result.scalars().all()

# 精准匹配 singeOrDefault
async def queryBookByTitle(title):
    async with AsyncSessionLocal() as session:
        result=await session.execute(select(Book).where(Book.Title==title))
        return result.scalar_one_or_none()

# 批量筛选书籍
async def batchQueryBooks(ids):
    async with AsyncSessionLocal() as session:
        result=await session.execute(select(Book).where(Book.Id.in_(ids)))
        return result.scalars().all()

# 聚合操作
async def jointOperation():
    async with AsyncSessionLocal() as session:
        # count
        # result=await session.execute(select(func.count(Book.Id)))

        # avg
        # result=await session.execute(select(func.avg(Book.Price)))

        # max/min
        # result=await session.execute(select(func.max(Book.Price)))

        # sum
        result=await session.execute(select(func.sum(Book.Price)))

        return result.scalar()

# 聚合操作(带条件筛选)
async def jointOperationV2():
    async with AsyncSessionLocal() as session:
        result=await session.execute(select(func.sum(Book.Price)).where(Book.Price>50))
        return result.scalar()

# 分页查询
async def queryPagingDatas(pageIndex=1, pageSize=3):
    async with AsyncSessionLocal() as session:
        result=await session.execute(select(Book).offset((pageIndex-1)*pageSize).limit(pageSize))
        return result.scalars().all()

# 分页查询(筛选条件+自定义排序字段)
async def queryPagingDatasV2(minPrice,pageIndex=1, pageSize=3):
    async with AsyncSessionLocal() as session:
        result=await session.execute(select(Book).where(Book.Price>minPrice)
                                     .order_by(Book.CreateDatetime.desc()) #asc()
                                     .offset((pageIndex-1)*pageSize).limit(pageSize))
        return result.scalars().all()


# 分页查询(筛选条件+延迟执行)
class QueryPagingDatasV3SearchInfo:
    Title=None
    Price=None


async def queryPagingDatasV3(searchInfo:QueryPagingDatasV3SearchInfo,pageIndex=1, pageSize=3):
    async with AsyncSessionLocal() as session:
        temp=select(Book)

        filters=[]
        if searchInfo.Title:
            filters.append(Book.Title.like(f"%{searchInfo.Title}%"))
        if searchInfo.Price:
            filters.append(Book.Price>searchInfo.Price)
        if filters:
            temp=temp.where(and_(*filters))

        temp = temp.order_by(Book.CreateDatetime.desc())
        temp = temp.offset((pageIndex - 1) * pageSize).limit(pageSize)
        result = await session.execute(temp)
        return result.scalars().all()




"""
入口函数
"""
async def main():
    # await initDatabase()

    # 获取所有书籍信息
    # books=await queryBooks()
    print("-------------查询结果--------------")
    # for book in books:
    #     print(f"{book.Id}\t{book.Title}\t{book.Author}\t{book.Price}\t{book.CreateDatetime}")

    # 获取第一本书
    # book=await queryFirstBook()
    # print(f"{book.Id}\t{book.Title}\t{book.Author}\t{book.Price}\t{book.CreateDatetime}")

    # 根据id查询书籍信息
    # book=await queryBookById("7805a7af-5a96-4d33-b1a3-9ac9ef48d2a9")
    # if book:
    #     print(f"{book.Id}\t{book.Title}\t{book.Author}\t{book.Price}\t{book.CreateDatetime}")
    # else:
    #     print("书籍信息不存在")

    # 查询价格大于50的书籍
    # books=await queryBooksByPrice(50)
    # for book in books:
    #     print(f"{book.Id}\t{book.Title}\t{book.Author}\t{book.Price}\t{book.CreateDatetime}")

    # 精准匹配
    # book=await queryBookByTitle("红楼梦")
    # if book:
    #     print(f"{book.Id}\t{book.Title}\t{book.Author}\t{book.Price}\t{book.CreateDatetime}")
    # else:
    #     print("书籍信息不存在")

    # 批量筛选书籍
    # books=await batchQueryBooks(
    #                 ["ea1b2895-2210-4666-a4b5-fb68a8ff1c19",
    #                  "6b145488-d418-4beb-9ae2-fcfc3ee55391"])
    # for book in books:
    #     print(f"{book.Id}\t{book.Title}\t{book.Author}\t{book.Price}\t{book.CreateDatetime}")

    # 聚合操作
    # result=await jointOperationV2() # jointOperation()
    # print("结果="+str(result))

    # 分页查询
    searchInfo=QueryPagingDatasV3SearchInfo()
    searchInfo.Price=50
    searchInfo.Title="西"
    books=await queryPagingDatasV3(searchInfo,1,3)
    for book in books:
        print(f"{book.Id}\t{book.Title}\t{book.Author}\t{book.Price}\t{book.CreateDatetime}")

    await asyncEngine.dispose()
    print("OK")


if __name__ == '__main__':
    asyncio.run(main())