FastAPI学习第三天
·
我尽量用代码的形式给大家展示
# 1,创建异步引擎,
# 2,定义模型类: 基类 + 表对应的模型类
# 3,建表: 定义函数建表 -> FastAPI 启动的时候调用建表的函数
from datetime import datetime
from fastapi import FastAPI, Depends
from sqlalchemy import DateTime, func, String, Float, select
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
app = FastAPI()
# 1,创建异步引擎
ASYNC_DATABASE_URL = "mysql+aiomysql://root:123456@localhost:3306/fastapi_first?charset=utf8"
async_engine = create_async_engine(
ASYNC_DATABASE_URL,
echo=True, # 可选,输出SQL日志
pool_size=10, # 设置连接池活跃的连接数
max_overflow=10 # 允许额外的连接数
)
# 2,定义模型类: 基类 + 表对应的模型类
# 基类: 创建时间、更新时间; 书籍表: id,书名,作者,价格,出版社
class Base(DeclarativeBase):
create_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), comment="创建时间")
update_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), onupdate=func.now(), comment="更新时间")
class Book(Base):
__tablename__ = "book" # 建一个名为book的表
id: Mapped[int] = mapped_column(primary_key=True, comment="书籍id")
book_name: Mapped[str] = mapped_column(String(255), comment="书名")
author: Mapped[str] = mapped_column(String(255), comment="作者")
price: Mapped[int] = mapped_column(Float, comment="价格")
publisher: Mapped[str] = mapped_column(String(255), comment="出版社")
# 3,建表: 定义函数建表 -> FastAPI 启动的时候调用建表的函数
async def create_table():
# 获取异步引擎,创建事务 - 建表
async with async_engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all) # Base 模型类的元数据创建
@app.on_event("startup")
async def startup():
await create_table()
@app.get("/")
async def root():
return {"message": "Hello World"}
# 需求:查询功能的接口,查询图书 -> 依赖注入: 创建依赖项获取数据库会话 + Depends 注入路由处理函数
AsyncSessionLocal = async_sessionmaker(
bind=async_engine, # 绑定数据库引擎
class_=AsyncSession, # 指定会话类
expire_on_commit=False # 提交后会话不过期,不会重新查询数据库
)
async def get_database():
async with AsyncSessionLocal() as session:
try:
yield session # 返回数据库会话给路由处理函数
await session.commit() # 提交事务
except Exception:
await session.rollback() # 有异常,回滚e
raise
finally:
await session.close()
@app.get("/book/books")
async def get_book_list(db: AsyncSession = Depends(get_database)):
# 查询
result = await db.execute(select(Book))
book = result.scalars().all() # scalars().all()获取所有的数据
return book
"""
数据库操作 - 查询
核心语句: await db.execute( select(模型类)), 返回一个ORM对象
获取所有数据
scalars().all()
获取单条数据
scalars().first() -> 获取第一条
get(模型类, 主键值)
"""
from datetime import datetime
from fastapi import FastAPI, Depends
from sqlalchemy import DateTime, func, String, Float, select
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
app = FastAPI()
# 1,创建异步引擎
ASYNC_DATABASE_URL = "mysql+aiomysql://root:123456@localhost:3306/fastapi_first?charset=utf8"
async_engine = create_async_engine(
ASYNC_DATABASE_URL,
echo=True, # 可选,输出SQL日志
pool_size=10, # 设置连接池活跃的连接数
max_overflow=10 # 允许额外的连接数
)
# 2,定义模型类: 基类 + 表对应的模型类
# 基类: 创建时间、更新时间; 书籍表: id,书名,作者,价格,出版社
class Base(DeclarativeBase):
create_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), comment="创建时间")
update_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), onupdate=func.now(), comment="更新时间")
class Book(Base):
__tablename__ = "book" # 建一个名为book的表
id: Mapped[int] = mapped_column(primary_key=True, comment="书籍id")
book_name: Mapped[str] = mapped_column(String(255), comment="书名")
author: Mapped[str] = mapped_column(String(255), comment="作者")
price: Mapped[int] = mapped_column(Float, comment="价格")
publisher: Mapped[str] = mapped_column(String(255), comment="出版社")
# 3,建表: 定义函数建表 -> FastAPI 启动的时候调用建表的函数
async def create_table():
# 获取异步引擎,创建事务 - 建表
async with async_engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all) # Base 模型类的元数据创建
@app.on_event("startup")
async def startup():
await create_table()
@app.get("/")
async def root():
return {"message": "Hello World"}
# 需求:查询功能的接口,查询图书 -> 依赖注入: 创建依赖项获取数据库会话 + Depends 注入路由处理函数
AsyncSessionLocal = async_sessionmaker(
bind=async_engine, # 绑定数据库引擎
class_=AsyncSession, # 指定会话类
expire_on_commit=False # 提交后会话不过期,不会重新查询数据库
)
async def get_database():
async with AsyncSessionLocal() as session:
try:
yield session # 返回数据库会话给路由处理函数
await session.commit() # 提交事务
except Exception:
await session.rollback() # 有异常,回滚e
raise
finally:
await session.close()
@app.get("/book/book_list")
async def get_book(db: AsyncSession = Depends(get_database)):
# result = await db.execute(select(Book))
# book = result.scalars().all() # 获取所有的数据
# book = result.scalars().first() # 获取第一条数据
book = await db.get(Book,5)
return book
"""
数据库操作 - 查询
核心语句: await db.execute( select(模型类)), 返回一个ORM对象
获取所有数据
scalars().all()
获取单条数据
scalars().first() -> 获取第一条
get(模型类, 主键值)
"""
"""
数据库操作 - 查询条件
select(Book).where(条件, 条件2, ...)
条件:
比较判断: ==; >; <; >=; <= 等
模糊查询: like()
与非查询: &; |; ~
包含查询: in_()
"""
from datetime import datetime
from fastapi import FastAPI, Depends
from sqlalchemy import DateTime, func, String, Float, select
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
app = FastAPI()
# 1,创建异步引擎
ASYNC_DATABASE_URL = "mysql+aiomysql://root:123456@localhost:3306/fastapi_first?charset=utf8"
async_engine = create_async_engine(
ASYNC_DATABASE_URL,
echo=True, # 可选,输出SQL日志
pool_size=10, # 设置连接池活跃的连接数
max_overflow=10 # 允许额外的连接数
)
# 2,定义模型类: 基类 + 表对应的模型类
# 基类: 创建时间、更新时间; 书籍表: id,书名,作者,价格,出版社
class Base(DeclarativeBase):
create_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), comment="创建时间")
update_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), onupdate=func.now(), comment="更新时间")
class Book(Base):
__tablename__ = "book" # 建一个名为book的表
id: Mapped[int] = mapped_column(primary_key=True, comment="书籍id")
book_name: Mapped[str] = mapped_column(String(255), comment="书名")
author: Mapped[str] = mapped_column(String(255), comment="作者")
price: Mapped[int] = mapped_column(Float, comment="价格")
publisher: Mapped[str] = mapped_column(String(255), comment="出版社")
# 3,建表: 定义函数建表 -> FastAPI 启动的时候调用建表的函数
async def create_table():
# 获取异步引擎,创建事务 - 建表
async with async_engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all) # Base 模型类的元数据创建
@app.on_event("startup")
async def startup():
await create_table()
@app.get("/")
async def root():
return {"message": "Hello World"}
# 需求:查询功能的接口,查询图书 -> 依赖注入: 创建依赖项获取数据库会话 + Depends 注入路由处理函数
AsyncSessionLocal = async_sessionmaker(
bind=async_engine, # 绑定数据库引擎
class_=AsyncSession, # 指定会话类
expire_on_commit=False # 提交后会话不过期,不会重新查询数据库
)
async def get_database():
async with AsyncSessionLocal() as session:
try:
yield session # 返回数据库会话给路由处理函数
await session.commit() # 提交事务
except Exception:
await session.rollback() # 有异常,回滚e
raise
finally:
await session.close()
@app.get("/book/book_list/{book_id}")
async def get_search_book(book_id: int, db: AsyncSession = Depends(get_database)):
result = await db.execute(select(Book).where(book_id == Book.id)) # 执行数据库查询:根据book_id查找匹配的图书记录
book = result.scalar_one_or_none()
return book
# 需求: 查询价格大于20的书籍
@app.get("/book/search_book")
async def search_book(db: AsyncSession = Depends(get_database)):
result = await db.execute(select(Book).where(Book.price >= 20))
books = result.scalars().all()
return books
"""
数据库操作 - 查询条件
select(Book).where(条件, 条件2, ...)
条件:
比较判断: ==; >; <; >=; <= 等
模糊查询: like()
与非查询: &; |; ~
包含查询: in_()
"""
""" 查询条件 - 模糊查询 模糊查询:like() % : 零个、一个或多个字符 _ : 一个单个字符 """
from datetime import datetime
from fastapi import FastAPI, Depends
from sqlalchemy import DateTime, func, String, Float, select
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
app = FastAPI()
# 1,创建异步引擎
ASYNC_DATABASE_URL = "mysql+aiomysql://root:123456@localhost:3306/fastapi_first?charset=utf8"
async_engine = create_async_engine(
ASYNC_DATABASE_URL,
echo=True, # 可选,输出SQL日志
pool_size=10, # 设置连接池活跃的连接数
max_overflow=10 # 允许额外的连接数
)
# 2,定义模型类: 基类 + 表对应的模型类
# 基类: 创建时间、更新时间; 书籍表: id,书名,作者,价格,出版社
class Base(DeclarativeBase):
create_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), comment="创建时间")
update_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), onupdate=func.now(), comment="更新时间")
class Book(Base):
__tablename__ = "book" # 建一个名为book的表
id: Mapped[int] = mapped_column(primary_key=True, comment="书籍id")
book_name: Mapped[str] = mapped_column(String(255), comment="书名")
author: Mapped[str] = mapped_column(String(255), comment="作者")
price: Mapped[int] = mapped_column(Float, comment="价格")
publisher: Mapped[str] = mapped_column(String(255), comment="出版社")
# 3,建表: 定义函数建表 -> FastAPI 启动的时候调用建表的函数
async def create_table():
# 获取异步引擎,创建事务 - 建表
async with async_engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all) # Base 模型类的元数据创建
@app.on_event("startup")
async def startup():
await create_table()
@app.get("/")
async def root():
return {"message": "Hello World"}
# 需求:查询功能的接口,查询图书 -> 依赖注入: 创建依赖项获取数据库会话 + Depends 注入路由处理函数
AsyncSessionLocal = async_sessionmaker(
bind=async_engine, # 绑定数据库引擎
class_=AsyncSession, # 指定会话类
expire_on_commit=False # 提交后会话不过期,不会重新查询数据库
)
async def get_database():
async with AsyncSessionLocal() as session:
try:
yield session # 返回数据库会话给路由处理函数
await session.commit() # 提交事务
except Exception:
await session.rollback() # 有异常,回滚e
raise
finally:
await session.close()
# 需求: 出版社以 起 开头 %、_
@app.get("/book/book_list")
async def get_book(db: AsyncSession = Depends(get_database)):
"""
like() 模糊查询:
% : 任意个字符;
_ : 一个单个字符
"""
# result = await db.execute(select(Book).where(Book.publisher.like("起_"))) -> []
# & | ~ 与非
# result = await db.execute(select(Book).where((Book.publisher.like("起%")) | (Book.price > 12)))
# 需求: 书籍id 列表,数据库里面的 id 如果在 书籍id列表里面 就返回
id_list = [2,4,6,8,11]
result = await db.execute(select(Book).where(Book.id.in_(id_list)))
book = result.scalars().all()
return book
"""
查询条件 - 模糊查询
模糊查询:like()
% : 零个、一个或多个字符
_ : 一个单个字符
"""
""" 数据库操作 - 聚合查询 聚合计算: func.方法(模型类.属性) count:统计行数量 avg:求平均值 max: 求最大值 min: 求最小值 sum: 求和 """
from datetime import datetime
from fastapi import FastAPI, Depends
from sqlalchemy import DateTime, func, String, Float, select
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
app = FastAPI()
# 1,创建异步引擎
ASYNC_DATABASE_URL = "mysql+aiomysql://root:123456@localhost:3306/fastapi_first?charset=utf8"
async_engine = create_async_engine(
ASYNC_DATABASE_URL,
echo=True, # 可选,输出SQL日志
pool_size=10, # 设置连接池活跃的连接数
max_overflow=10 # 允许额外的连接数
)
# 2,定义模型类: 基类 + 表对应的模型类
# 基类: 创建时间、更新时间; 书籍表: id,书名,作者,价格,出版社
class Base(DeclarativeBase):
create_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), comment="创建时间")
update_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), onupdate=func.now(), comment="更新时间")
class Book(Base):
__tablename__ = "book" # 建一个名为book的表
id: Mapped[int] = mapped_column(primary_key=True, comment="书籍id")
book_name: Mapped[str] = mapped_column(String(255), comment="书名")
author: Mapped[str] = mapped_column(String(255), comment="作者")
price: Mapped[int] = mapped_column(Float, comment="价格")
publisher: Mapped[str] = mapped_column(String(255), comment="出版社")
# 3,建表: 定义函数建表 -> FastAPI 启动的时候调用建表的函数
async def create_table():
# 获取异步引擎,创建事务 - 建表
async with async_engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all) # Base 模型类的元数据创建
@app.on_event("startup")
async def startup():
await create_table()
@app.get("/")
async def root():
return {"message": "Hello World"}
# 需求:查询功能的接口,查询图书 -> 依赖注入: 创建依赖项获取数据库会话 + Depends 注入路由处理函数
AsyncSessionLocal = async_sessionmaker(
bind=async_engine, # 绑定数据库引擎
class_=AsyncSession, # 指定会话类
expire_on_commit=False # 提交后会话不过期,不会重新查询数据库
)
async def get_database():
async with AsyncSessionLocal() as session:
try:
yield session # 返回数据库会话给路由处理函数
await session.commit() # 提交事务
except Exception:
await session.rollback() # 有异常,回滚e
raise
finally:
await session.close()
@app.get('/book/juhe')
async def get_book(db: AsyncSession = Depends(get_database)):
# result = await db.execute(select(func.count(Book.id))) # 统计数据库中数据的条数
# result = await db.execute(select(func.sum(Book.price))) # 计算价格的总和
# result = await db.execute(select(func.avg(Book.price))) # 计算价格的平均值
result = await db.execute(select(func.max(Book.price))) # 得到最高的书籍价格
num = result.scalar() # 用来提取一个数值 -> 标量值
return num
"""
数据库操作 - 聚合查询
聚合计算: func.方法(模型类.属性)
count:统计行数量
avg:求平均值
max: 求最大值
min: 求最小值
sum: 求和
"""
"""
数据库查询操作 - 分页查询
分页查询: select().offset().limit()
offset:跳过的记录数
limit: 返回的记录数
offset值 = (当前页码 - 1) * 每页数量
"""
from datetime import datetime
from fastapi import FastAPI, Depends
from sqlalchemy import DateTime, func, String, Float, select
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
app = FastAPI()
# 1,创建异步引擎
ASYNC_DATABASE_URL = "mysql+aiomysql://root:123456@localhost:3306/fastapi_first?charset=utf8"
async_engine = create_async_engine(
ASYNC_DATABASE_URL,
echo=True, # 可选,输出SQL日志
pool_size=10, # 设置连接池活跃的连接数
max_overflow=10 # 允许额外的连接数
)
# 2,定义模型类: 基类 + 表对应的模型类
# 基类: 创建时间、更新时间; 书籍表: id,书名,作者,价格,出版社
class Base(DeclarativeBase):
create_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), comment="创建时间")
update_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), onupdate=func.now(), comment="更新时间")
class Book(Base):
__tablename__ = "book" # 建一个名为book的表
id: Mapped[int] = mapped_column(primary_key=True, comment="书籍id")
book_name: Mapped[str] = mapped_column(String(255), comment="书名")
author: Mapped[str] = mapped_column(String(255), comment="作者")
price: Mapped[int] = mapped_column(Float, comment="价格")
publisher: Mapped[str] = mapped_column(String(255), comment="出版社")
# 3,建表: 定义函数建表 -> FastAPI 启动的时候调用建表的函数
async def create_table():
# 获取异步引擎,创建事务 - 建表
async with async_engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all) # Base 模型类的元数据创建
@app.on_event("startup")
async def startup():
await create_table()
@app.get("/")
async def root():
return {"message": "Hello World"}
# 需求:查询功能的接口,查询图书 -> 依赖注入: 创建依赖项获取数据库会话 + Depends 注入路由处理函数
AsyncSessionLocal = async_sessionmaker(
bind=async_engine, # 绑定数据库引擎
class_=AsyncSession, # 指定会话类
expire_on_commit=False # 提交后会话不过期,不会重新查询数据库
)
async def get_database():
async with AsyncSessionLocal() as session:
try:
yield session # 返回数据库会话给路由处理函数
await session.commit() # 提交事务
except Exception:
await session.rollback() # 有异常,回滚e
raise
finally:
await session.close()
@app.get("/book/book_list")
async def get_book(
page: int,
page_size: int = 2,
db: AsyncSession = Depends(get_database)
):
# offset: 跳过的数量 limit: 每页的数据量
skip = (page - 1) * page_size
result = await db.execute(select(Book).offset(skip).limit(page_size))
book = result.scalars().all()
return book
"""
数据库查询操作 - 分页查询
分页查询: select().offset().limit()
offset:跳过的记录数
limit: 返回的记录数
offset值 = (当前页码 - 1) * 每页数量
"""
""" 数据库操作 - 新增 核心步骤: 定义ORM对象 -> 添加对象到事务: add(对象) -> commit提交到数据库 """
# ** 字典键值对取值,__dict__变成字典格式
from datetime import datetime
from fastapi import FastAPI, Depends
from sqlalchemy import DateTime, func, String, Float, select
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from pydantic import BaseModel
app = FastAPI()
# 1,创建异步引擎
ASYNC_DATABASE_URL = "mysql+aiomysql://root:123456@localhost:3306/fastapi_first?charset=utf8"
async_engine = create_async_engine(
ASYNC_DATABASE_URL,
echo=True, # 可选,输出SQL日志
pool_size=10, # 设置连接池活跃的连接数
max_overflow=10 # 允许额外的连接数
)
# 2,定义模型类: 基类 + 表对应的模型类
# 基类: 创建时间、更新时间; 书籍表: id,书名,作者,价格,出版社
class Base(DeclarativeBase):
create_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), comment="创建时间")
update_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), onupdate=func.now(), comment="更新时间")
class Book(Base):
__tablename__ = "book" # 建一个名为book的表
id: Mapped[int] = mapped_column(primary_key=True, comment="书籍id")
book_name: Mapped[str] = mapped_column(String(255), comment="书名")
author: Mapped[str] = mapped_column(String(255), comment="作者")
price: Mapped[int] = mapped_column(Float, comment="价格")
publisher: Mapped[str] = mapped_column(String(255), comment="出版社")
# 3,建表: 定义函数建表 -> FastAPI 启动的时候调用建表的函数
async def create_table():
# 获取异步引擎,创建事务 - 建表
async with async_engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all) # Base 模型类的元数据创建
@app.on_event("startup")
async def startup():
await create_table()
@app.get("/")
async def root():
return {"message": "Hello World"}
# 需求:查询功能的接口,查询图书 -> 依赖注入: 创建依赖项获取数据库会话 + Depends 注入路由处理函数
AsyncSessionLocal = async_sessionmaker(
bind=async_engine, # 绑定数据库引擎
class_=AsyncSession, # 指定会话类
expire_on_commit=False # 提交后会话不过期,不会重新查询数据库
)
async def get_database():
async with AsyncSessionLocal() as session:
try:
yield session # 返回数据库会话给路由处理函数
await session.commit() # 提交事务
except Exception:
await session.rollback() # 有异常,回滚e
raise
finally:
await session.close()
# 需求: 用户输入图书信息(id,书名,作者,价格,出版社) -> 新增
# 用户输入 -> 参数 -> 请求体
class BookBase(BaseModel):
id: int
book_name: str
author: str
price: int
publisher: str
@app.post("/book/book_list")
async def add_book(book: BookBase, db: AsyncSession = Depends(get_database)):
# ORM对象 -> add -> commit
book_obj = Book(**book.__dict__) # ** 字典键值对取值,__dict__变成字典格式
db.add(book_obj)
await db.commit()
return book
"""
数据库操作 - 新增
核心步骤: 定义ORM对象 -> 添加对象到事务: add(对象) -> commit提交到数据库
"""
更多推荐
所有评论(0)