← 返回AI变现
🌐 其他
3.FastAPI ORM建表
FastAPI ORM建表操作, 数据库配置、ORM基类、table表的定义、数据库初始化获取数据库会话依赖、异步会话工厂 通过注入执行增删改查
3.FastAPI ORM建表
Fanta丶 2026-08-17 0 é 读2åéORM - åå»ºæ°æ®åºå¼æ
ä½¿ç¨ create_async_engine åå»ºå¼æ¥å¼æ
# 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
]
Aitishiku.com