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
    ]
相关推荐
Want5955 小时前
Python大雪纷飞①
开发语言·python·数学建模
程序员清风5 小时前
Python 数据可视化入门:Matplotlib 核心用法
python·信息可视化·matplotlib
溪语流沙6 小时前
【Web全栈进阶】前端对接新契约:信封解包 + 统一错误处理
前端·vue.js·python·状态模式·fastapi
Python图像识别6 小时前
56-【2027毕设】YOLO11X光安检危险物品检测系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
winfredzhang6 小时前
从零实现“照片按地理位置显示在矢量地图上”:Flask + SQLite + Leaflet 全栈实战
python·sqlite·flask
外收内放6 小时前
Python基础语法练习题(72)
开发语言·python
171320330计算机毕设编程7 小时前
计算机毕业设计 基于Hadoop的新能源汽车发展前景分析 LW PPT
java·大数据·hadoop·python·算法·随机森林·线性回归
haluhalu.7 小时前
深入理解 AI Agent(1.2):Harness 工程——模型之外的竞争力
前端·数据结构·人工智能·python·langchain·个人开发
东莞市云毅网络有限公司7 小时前
把网页表格与列表还原成结构化条目:抽取与对账实现
python·文本处理·数据抽取
夜瞬7 小时前
从零微调 Qwen3-8B:基于 LoRA 与 LLaMA-Factory 打造专属 AI 编程助教
人工智能·python·llama