macos:新建fastapi项目之二:用sqlalchemy框架访问mysql数据库
一,安装所需的库
% pip install sqlalchemy aiomysql pydantic
二,代码
# main.py - 第一个FastAPI程序
from fastapi import FastAPI
from fastapi import APIRouter, Request, Depends
# app/core/database.py
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy import String
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select # 2.0 推荐使用 select 语法
# 数据库连接URL
# 格式:数据库类型+驱动://用户名:密码@主机:端口/数据库名
DATABASE_URL = "mysql+aiomysql://root:rootpassword@localhost:3306/my_base"
# 创建异步引擎
# engine 是数据库连接的核心对象,负责管理连接池
engine = create_async_engine(
DATABASE_URL,
echo=True, # 打印SQL语句,方便调试,生产环境应设为False
pool_size=10, # 连接池大小
max_overflow=20 # 连接池溢出后的最大连接数
)
# 创建会话工厂
# AsyncSessionLocal 可以创建数据库会话对象
AsyncSessionLocal = async_sessionmaker(engine, expire_on_commit=False)
# 创建模型基类
# 所有的数据模型都要继承这个类
Base = declarative_base()
# 获取数据库会话的依赖函数
async def get_db():
async with AsyncSessionLocal() as session:
try:
yield session # 把会话交给接口使用
await session.commit() # 正常结束则提交事务
except Exception:
await session.rollback() # 发生异常则回滚
raise
finally:
await session.close() # 关闭会话
# 商品模型
class User(Base):
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True,comment='主键')
username: Mapped[str] = mapped_column(String(100),server_default="''", comment='商品名称')
# 创建FastAPI应用实例
# 可以设置标题、描述、版本等元数据
app = FastAPI(
title="我的第一个FastAPI应用",
description="这是一个学习FastAPI的示例项目")
# 定义根路径GET请求
@app.get("/hello")
async def root():
"""
根路径处理函数
返回欢迎信息
"""
return {
"message": "Hello FastAPI!"
}
@app.get("/all")
async def get_all_products(request: Request, db: AsyncSession = Depends(get_db)):
# 异步写法不能直接用 db.query(),必须用 select
skip = 0
limit = 10
stmt = select(User).offset(skip).limit(limit)
result = await db.execute(stmt) # 必须 await 数据库 I/O
prods = result.scalars().all()
res = {
"list": prods,
}
return res
数据库内容:

三,测试效果:

浙公网安备 33010602011771号