VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • SQLAlchemy 核心概念与同步引擎配置详解

  1. SQLAlchemy 核心概念与同步引擎配置
    1.1 ORM 基础原理
    对象关系映射(ORM)如同翻译官,将数据库表转换为Python类,把行记录变成对象实例。SQLAlchemy 的核心组件构成数据库操作的"三件套":

Engine:数据库连接的发动机,管理连接池(类似网约车平台调度车辆)
Connection:具体数据库连接(相当于一辆出租车)
Session:工作单元,跟踪对象状态变化(类似乘客的行程记录)
1.2 同步引擎配置实战
1.2.1 安装依赖
pip install fastapi sqlalchemy uvicorn
1.2.2 配置数据库引擎

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 创建数据库引擎(连接池最大10个连接)
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(
    DATABASE_URL,
    connect_args={"check_same_thread": False},  # SQLite专用参数
    pool_size=10,
    max_overflow=20,
    pool_recycle=3600
)

# 创建会话工厂(autocommit自动提交需谨慎使用)
SessionLocal = sessionmaker(
    bind=engine,
    autocommit=False,
    autoflush=False,
    expire_on_commit=True
)

1.2.3 模型类定义

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(50), nullable=False)
    email = Column(String(100), unique=True, index=True)

    # 类比pydantic模型
    def __repr__(self):
        return f"<User {self.email}>"

1.2.4 FastAPI 集成

from fastapi import Depends, FastAPI
from sqlalchemy.orm import Session

app = FastAPI()

# 创建数据库表(生产环境应使用迁移工具)
Base.metadata.create_all(bind=engine)


# 依赖项获取数据库会话
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


@app.post("/users/")
def create_user(name: str, email: str, db: Session = Depends(get_db)):
    db_user = User(name=name, email=email)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return {"id": db_user.id}

1.3 核心组件深入解析
1.3.1 连接池工作机制
初始化时创建最小连接数(pool_size)
当请求超过pool_size时,创建临时连接(max_overflow)
pool_recycle 防止数据库断开闲置连接
1.3.2 Session 生命周期

# 正确使用示例
def transaction_example():
    db = SessionLocal()
    try:
        # 执行操作1
        user = User(name="Alice")
        db.add(user)

        # 执行操作2
        db.execute("UPDATE counters SET value = value + 1")

        db.commit()
    except Exception:
        db.rollback()
        raise
    finally:
        db.close()

1.4 课后 Quiz
问题1:当出现数据库连接泄漏时,最可能配置哪个参数来缓解?
A. pool_size
B. max_overflow
C. pool_recycle
D. connect_args

答案解析:正确答案 B。max_overflow 控制允许超出 pool_size 的临时连接数量,当连接泄漏发生时,限制最大连接数可以防止系统资源耗尽。根本解决方案需要检查是否正确关闭会话。

问题2:Session 的 expire_on_commit 参数设置为 False 时会导致什么后果?
A. 提高查询性能
B. 对象属性过期需要重新查询
C. 可能读取到数据库过期数据
D. 自动提交事务

答案解析:正确答案 C。当 expire_on_commit=False 时,Session 提交后不会过期对象,后续访问属性可能读取缓存而非数据库最新值,导致数据不一致。

1.5 常见报错解决方案
错误1:sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table
产生原因:

未执行数据库表创建
模型类未正确定义 tablename
数据库文件路径配置错误
解决方案:

# 确保执行建表语句
Base.metadata.create_all(bind=engine)


# 检查模型类定义
class User(Base):
    __tablename__ = "users"  # 必须与数据库表名一致
    # ...

错误2:sqlalchemy.exc.TimeoutError: QueuePool limit overflow
产生原因:

未正确释放数据库会话
连接池配置过小
存在长时间运行的事务
优化建议:

# 调整连接池配置
create_engine(
    pool_size=20,
    max_overflow=30,
    pool_pre_ping=True  # 检查连接是否存活
)


# 使用上下文管理器确保会话关闭
def get_db():
    with SessionLocal() as db:
        yield db

错误3:pydantic.error_wrappers.ValidationError
处理建议:

添加请求模型验证

from pydantic import BaseModel


class UserCreate(BaseModel):
    name: str
    email: str


@app.post("/users/")
def create_user(user: UserCreate, db: Session = Depends(get_db)):
    # 使用经过验证的数据
    db_user = User(**user.dict())
    # ...

来源:https://www.cnblogs.com/Amd794/p/18824064


相关教程