SQLAlchemy
已于 2025年11月11日 09:50 修改
访问次数:0
SQLAlchemy —— 这是 Python 后端开发中最常用、最强大的 ORM(对象关系映射)框架之一。
🧩 一、SQLAlchemy 是什么
SQLAlchemy 是一个用于操作数据库的 Python 库。
它提供两种层次的使用方式:
- Core(SQL Expression Language) → 偏底层,接近 SQL 操作方式,灵活度高。
- 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 对象与数据库交互 |
Base | ORM 模型的基类 |
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()
🧩 六、最佳实践与规范
- 每个请求使用独立的 Session 避免多线程/协程间共享 Session。
- 使用上下文管理 用 with Session() as session: 代替手动关闭。
- 事务操作要显式提交或回滚 尤其在异常时要 session.rollback()
- 避免 N+1 查询 使用 joinedload() 或 selectinload() 优化查询。
- 模型类命名清晰、表名小写、字段名统一 例如 UserAccount → 表名 user_account
评论(0)