1. 为什么需要ORM工具?
十年前我刚接触Python操作数据库时,还在用原始的字符串拼接SQL语句。直到某次线上事故让我彻底改变了做法——因为一个未转义的用户输入,导致整个用户表被意外清空。这就是为什么现代Python开发都推荐使用ORM(Object-Relational Mapping)工具,而SQLAlchemy正是这个领域的瑞士军刀。
SQLAlchemy不是简单的SQL生成器,它提供了两个层次的操作方式:核心的SQL表达式语言和全功能的ORM。我们今天重点讨论的是它的ORM组件,它能让你用Python类的方式操作数据库,就像下面这样简单的代码就能完成用户查询:
python复制user = session.query(User).filter_by(username='张三').first()
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SQLAlchemy ORM核心架构解析
2.1 声明式基类(Declarative Base)
所有ORM模型的起点都是这个基类。最新版本的SQLAlchemy(2.0+)推荐这样创建:
python复制from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
这个基类会维护一个元数据(Metadata)对象,记录所有模型类的结构信息。我习惯在项目中创建一个models/__init__.py来集中管理这个基类。
2.2 模型定义最佳实践
一个完整的用户模型示例:
python复制from datetime import datetime
from sqlalchemy import String, Integer, DateTime
from sqlalchemy.orm import Mapped, mapped_column
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
username: Mapped[str] = mapped_column(String(50), unique=True, nullable=False)
password_hash: Mapped[str] = mapped_column(String(128))
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now)
def __repr__(self):
return f"<User {self.username}>"
注意几个关键点:
- 使用Python类型注解+Mapped类型声明字段
- 每个字段必须明确指定数据库类型
__tablename__必须是显式声明的- 主键字段是必须
