数据库连接配置(database.py)

SQLAlchemy 操作数据库需要三样东西:

组件作用
Engine连接池,管理数据库连接
SessionLocal会话工厂,每次请求创建一个会话
Base所有 Model 的基类

一、完整代码

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, DeclarativeBase

# 数据库连接地址
# SQLite(本地文件数据库,适合学习和开发)
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
# MySQL:       "mysql+pymysql://user:password@localhost:3306/dbname"
# PostgreSQL:  "postgresql://user:password@localhost:5432/dbname"

# 创建 Engine
engine = create_engine(
    SQLALCHEMY_DATABASE_URL,
    connect_args={"check_same_thread": False},  # SQLite 专用,MySQL/PG 不需要
)

# 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 声明基类(所有 Model 继承它)
class Base(DeclarativeBase):
    pass

二、逐行解释

1. create_engine — 创建引擎

engine = create_engine("sqlite:///./test.db", connect_args={"check_same_thread": False})
  • sqlite:///./test.db:三个斜杠 /// 表示相对路径,运行后会在项目目录下生成 test.db 文件
  • check_same_thread=False:SQLite 默认只允许创建它的线程访问,但 FastAPI 是多线程处理请求的,加这个参数解除限制
  • MySQL / PostgreSQL 不需要 connect_args 这个参数

2. sessionmaker — 创建会话工厂

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  • 调用 SessionLocal() 一次 = 打开一个数据库会话
  • autocommit=False:手动控制事务,调用 db.commit() 才会真正写入
  • autoflush=False:查询前不自动 flush,手动控制更清晰
  • bind=engine:绑定到上面创建的引擎

3. DeclarativeBase — 声明基类

class Base(DeclarativeBase):
    pass
  • 所有的数据模型(表)都继承这个类