第 7 章: 数据库
本章概述
学习如何将FastAPI连接到关系数据库(如MySQL、PostgreSQL、SQLite)。
7.1 安装依赖
pip install sqlalchemy
pip install pymysql # MySQL驱动
# 或
pip install psycopg2 # PostgreSQL驱动
# 或
pip install aiosqlite # SQLite异步驱动7.2 配置连接
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "mysql+pymysql://user:password@localhost/dbname"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()7.3 创建模型(数据库表)
from sqlalchemy import Column, Integer, String
from database import Base
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
username = Column(String(50), unique=True, index=True)
email = Column(String(100), unique=True, index=True)
password = Column(String(100))7.4 创建表
# 在应用启动时创建表
Base.metadata.create_all(bind=engine)7.5 在路由中注入数据库会话
from fastapi import Depends
from sqlalchemy.orm import Session
from database import SessionLocal
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.get("/users/")
def read_users(db: Session = Depends(get_db)):
users = db.query(User).all()
return users7.6 CRUD操作
# 创建
def create_user(db: Session, user: UserCreate):
db_user = User(**user.dict())
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
# 读取
def get_user(db: Session, user_id: int):
return db.query(User).filter(User.id == user_id).first()
# 更新
def update_user(db: Session, user_id: int, user: UserUpdate):
db_user = db.query(User).filter(User.id == user_id).first()
for key, value in user.dict(exclude_unset=True).items():
setattr(db_user, key, value)
db.commit()
return db_user
# 删除
def delete_user(db: Session, user_id: int):
db_user = db.query(User).filter(User.id == user_id).first()
db.delete(db_user)
db.commit()7.7 关系
一对多关系
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
tasks = relationship("Task", back_populates="owner")
class Task(Base):
__tablename__ = "tasks"
id = Column(Integer, primary_key=True)
owner_id = Column(Integer, ForeignKey("users.id"))
owner = relationship("User", back_populates="tasks")多对多关系
task_tags = Table(
"task_tags",
Base.metadata,
Column("task_id", Integer, ForeignKey("tasks.id")),
Column("tag_id", Integer, ForeignKey("tags.id"))
)
class Task(Base):
__tablename__ = "tasks"
id = Column(Integer, primary_key=True)
tags = relationship("Tag", secondary=task_tags, back_populates="tasks")
class Tag(Base):
__tablename__ = "tags"
id = Column(Integer, primary_key=True)
tasks = relationship("Task", secondary=task_tags, back_populates="tags")7.8 分页
@app.get("/tasks/")
def read_tasks(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
tasks = db.query(Task).offset(skip).limit(limit).all()
return tasks小结
本章学习了: - ✅ 安装SQLAlchemy和数据库驱动 - ✅ 配置数据库连接 - ✅ 创建数据库模型 - ✅ 使用依赖注入管理数据库会话 - ✅ 实现CRUD操作 - ✅ 数据库关系(一对多、多对多) - ✅ 分页功能