SQLAlchemy

SQLAlchemy —— 这是 Python 后端开发中最常用、最强大的 ORM(对象关系映射)框架之一。



🧩 一、SQLAlchemy 是什么

SQLAlchemy 是一个用于操作数据库的 Python 库。

它提供两种层次的使用方式:

  1. Core(SQL Expression Language) → 偏底层,接近 SQL 操作方式,灵活度高。
  2. ORM(Object Relational Mapper) → 高层封装,通过类与对象操作数据库表,更面向对象。

常见用途包括:

  • Django 以外的 Web 后端(如 Flask、FastAPI、Tornado);
  • 数据分析项目中统一数据库访问层;
  • 自动生成、迁移、映射数据库结构。


⚙️ 二、安装

pip install sqlalchemy
# 常配合 MySQL 驱动
pip install pymysql


🏗️ 三、基本用法示例(ORM 模式)

下面是一个完整的使用示例:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker

# 定义数据库连接
engine = create_engine(
    "mysql+pymysql://root:password@localhost:3306/testdb",
    echo=True,  # 打印 SQL 语句(调试用)
)

# 定义基类
Base = declarative_base()

# 定义模型类(对应数据库表)
class User(Base):
    __tablename__ = "users"
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50))
    email = Column(String(100))

# 创建表(如果不存在)
Base.metadata.create_all(engine)

# 创建会话
SessionLocal = sessionmaker(bind=engine)
session = SessionLocal()

# 插入数据
user = User(name="Alice", email="alice@example.com")
session.add(user)
session.commit()

# 查询数据
users = session.query(User).filter_by(name="Alice").all()
for u in users:
    print(u.id, u.name, u.email)

# 更新数据
u = session.query(User).filter_by(name="Alice").first()
u.email = "newalice@example.com"
session.commit()

# 删除数据
session.delete(u)
session.commit()

# 关闭会话
session.close()


🧠 四、SQLAlchemy 的常见组成部分

组件作用
Engine负责数据库连接(底层驱动)
Session管理 ORM 对象与数据库交互
BaseORM 模型的基类
Query查询接口(支持链式调用)
Column / Table定义表结构
relationship定义表间关系(如一对多、多对多)


🌐 五、在 Web 框架中的常用场景

1️⃣ Flask + SQLAlchemy

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:1234@localhost/testdb"
db = SQLAlchemy(app)

2️⃣ FastAPI + SQLAlchemy

from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
from database import SessionLocal, engine, Base

app = FastAPI()

# 依赖注入
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


🧩 六、最佳实践与规范

  1. 每个请求使用独立的 Session 避免多线程/协程间共享 Session。
  2. 使用上下文管理 用 with Session() as session: 代替手动关闭。
  3. 事务操作要显式提交或回滚 尤其在异常时要 session.rollback()
  4. 避免 N+1 查询 使用 joinedload() 或 selectinload() 优化查询。
  5. 模型类命名清晰、表名小写、字段名统一 例如 UserAccount → 表名 user_account
文章标签:

评论(0)