文章目录
前言
学习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())