3.FastAPI ORM建表

ORM - 创建数据库引擎

使用 create_async_engine 创建异步引擎

python 复制代码
# pip install sqlalchemy[asyncio] aiomysql fastapi uvicorn
from contextlib import asynccontextmanager
from datetime import datetime
from typing import AsyncGenerator

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

# ==================== 数据库配置 ====================
ASYNC_DB_URL = "mysql+aiomysql://root:123456@localhost:3306/fastapi01"

async_engine = create_async_engine(
    ASYNC_DB_URL,
    echo=True,  # 打印SQL语句,生产环境关闭
    pool_size=10,
    max_overflow=20,
)

# 异步会话工厂 通过注入执行增删改查
AsyncSessionLocal = async_sessionmaker(
    bind=async_engine,
    class_=AsyncSession,
    expire_on_commit=False,  # 提交后不失效对象,开发常用优化
)

# ==================== ORM基类 ====================
class Base(DeclarativeBase):
    # 创建时间:仅新增时自动填充
    create_time: Mapped[datetime] = mapped_column(
        DateTime, default=func.now(), comment="创建时间"
    )
    # 更新时间:新增默认填充,更新自动刷新
    update_time: Mapped[datetime] = mapped_column(
        DateTime, default=func.now(), onupdate=func.now(), comment="修改时间"
    )

class Book(Base):
    __tablename__ = "book"
    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True, comment="编号")
    bookname: Mapped[str] = mapped_column(String(100), comment="书名")
    author: Mapped[str] = mapped_column(String(100), comment="作者")
    price: Mapped[float] = mapped_column(Float, comment="价格")
    publisher: Mapped[str] = mapped_column(String(255), comment="出版社")

# ==================== 数据库初始化 ====================
async def create_tables():
    """启动时自动创建数据表(仅开发使用,生产使用Alembic迁移)"""
    async with async_engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)

# 获取数据库会话依赖
async def get_db() -> AsyncGenerator[AsyncSession, None]:
    async with AsyncSessionLocal() as session:
        yield session
        await session.commit()

# ==================== FastAPI Lifespan ====================
@asynccontextmanager
async def lifespan(app: FastAPI):
    print("🚀 服务启动,初始化数据库...")
    await create_tables()
    yield
    print("🛑 服务关闭,释放数据库连接")
    await async_engine.dispose()  # 关闭异步引擎,释放连接池

app = FastAPI(lifespan=lifespan)

# ==================== 接口示例 ====================
@app.get("/")
async def home():
    return {"msg": "欢迎访问首页"}

# 查询书籍示例接口
@app.get("/books")
async def get_book_list(db: AsyncSession = Depends(get_db)):
    stmt = select(Book)
    result = await db.execute(stmt)
    books = result.scalars().all()
    return [
        {
            "id": item.id,
            "bookname": item.bookname,
            "author": item.author,
            "price": item.price,
            "publisher": item.publisher,
            "create_time": item.create_time,
            "update_time": item.update_time
        }
        for item in books
    ]
相关推荐
段一凡-华北理工大学6 小时前
工业智能体:从Codex/Claude到项目实战~系列文章05:从“AI助手“到“工业智能体“:能力跃迁与落地范式
人工智能·python·claude·codex·工业智能体·高炉炼铁智能化
深蓝AI6 小时前
ContextVar 到线程池就丢了?asyncio.to_thread 和 run_in_executor 实测
python
岁月宁静7 小时前
什么是 Agent:从"会聊天"到"会做事"
人工智能·python
岁月宁静7 小时前
AI 应用开发工程师简历怎么写:HR 初筛、技术复筛、面试追问,三道关卡各看什么?
人工智能·python·面试
来让爷抱一个8 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
小肝一下10 小时前
3.基础语法(3)
python
深蓝AI10 小时前
Python 子进程树:父进程被杀后,孙进程为何还在跑?
python
心祭丫丫11 小时前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
爱你真是太好了11 小时前
Skill 索引瘦身与渐进加载
python
贾公子11 小时前
检测链路的容量规划——用 Little's Law 算清 QPS、并发与积压
后端·python