很多初学 Python 后端的人一听 ORM 就懵:明明 SQL 能查数据库,为什么还要学 ORM?

简单说,ORM 是为了让你用 Python 对象的方式操作数据库表。它不是让你完全不用 SQL,而是把大量重复的增删改查、对象映射、字段校验、关系处理封装起来,让业务代码更容易维护。

如果你以后做 FastAPI、Django、AI 应用后端、RAG 知识库系统,ORM 基本绕不开。

【一、ORM 是什么】

ORM 全称 Object Relational Mapping,对象关系映射。

可以这样理解:

数据库表 -> Python 类

表里的一行记录 -> Python 对象

表里的字段 -> Python 对象属性

比如数据库有一张用户表:

sql

CREATE TABLE users (

  id BIGINT PRIMARY KEY AUTO_INCREMENT,

  username VARCHAR(50),

  email VARCHAR(255)

);

ORM 里可能会写成:

python

class User:

    id: int

    username: str

    email: str

你不用每次都手写 SQL 字符串,而是通过对象来创建、查询、修改。

【二、为什么后端项目会用 ORM】

ORM 主要解决这些问题:

- 减少重复 SQL。

- 把数据库表结构映射成代码模型。

- 让业务代码更关注业务本身。

- 统一管理数据库连接和事务。

- 降低 SQL 注入风险。

- 方便做迁移、测试和表关系维护。

如果不用 ORM,代码可能到处都是:

python

sql = f"SELECT * FROM users WHERE email = '{email}'"

这不仅难维护,还有 SQL 注入风险。

【三、ORM 不是让你不学 SQL】

这个点很重要。

ORM 可以让你少写 SQL,但不能让你不懂 SQL。

因为你仍然要知道:

- ORM 最终会生成什么 SQL。

- 查询有没有走索引。

- 是否产生 N+1 查询。

- 事务有没有正确提交和回滚。

- 大量数据查询是否会拖垮内存。

面试时如果你只说“ORM 就是不用写 SQL”,会显得很浅。更好的说法是:ORM 提高开发效率,但复杂查询和性能优化仍然需要理解 SQL 和数据库执行计划。

【四、SQLAlchemy 是什么】

SQLAlchemy 是 Python 生态里非常常用的 ORM,FastAPI 项目里经常搭配它。

一个简化模型大概这样:

python

from sqlalchemy import Column, Integer, String

from sqlalchemy.orm import declarative_base

Base = declarative_base()

class User(Base):

    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)

    username = Column(String(50), nullable=False)

    email = Column(String(255), unique=True, nullable=False)

查询用户:

python

user = db.query(User).filter(User.email == "a@test.com").first()

创建用户:

python

user = User(username="tom", email="a@test.com")

db.add(user)

db.commit()

db.refresh(user)

你写的是 Python 对象操作,ORM 会帮你转成 SQL 执行。

【五、Django ORM 是什么】

Django 自带 ORM,和 Django 框架结合很深。

模型示例:

python

from django.db import models

class UserProfile(models.Model):

    username = models.CharField(max_length=50)

    email = models.EmailField(unique=True)

    created_at = models.DateTimeField(auto_now_add=True)

查询:

python

user = UserProfile.objects.filter(email="a@test.com").first()

创建:

python

UserProfile.objects.create(username="tom", email="a@test.com")

Django ORM 的优势是和 Admin、表单、权限、迁移系统配合得很好,适合快速做管理后台和业务系统。

【六、什么是数据库迁移】

迁移就是把代码里的模型变化同步到数据库。

比如你给用户表新增字段:

python

phone = models.CharField(max_length=20, null=True)

数据库里也要新增 `phone` 列。手动改容易出错,所以框架提供迁移工具。

Django:

bash

python manage.py makemigrations

python manage.py migrate

SQLAlchemy 常搭配 Alembic:

bash

alembic revision --autogenerate -m "add phone to users"

alembic upgrade head

项目里不能随便直接改线上表,迁移文件就是数据库结构变化的记录。

【七、N+1 查询是什么】

N+1 是 ORM 高频坑。

例子:查询 10 篇文章,然后每篇文章再查作者。

text

先查 1 次文章列表

再查 10 次作者

总共 11 次查询

如果文章是 1000 篇,就可能变成 1001 次查询。

解决思路:

- 使用预加载。

- 使用 JOIN。

- 批量查询关联数据。

- 查看 ORM 实际生成 SQL。

面试问 ORM 性能问题时,N+1 基本是必答点。

【八、项目中怎么选】

如果你做 FastAPI 项目:

- 常用 SQLAlchemy。

- 想写异步数据库可以看 SQLAlchemy Async、Tortoise ORM。

- 表迁移常用 Alembic。

如果你做 Django 项目:

- 直接使用 Django ORM。

- 管理后台、权限、用户系统和 ORM 都是内置优势。

如果是小 demo:

- SQLite + SQLAlchemy 就够。

如果是正式项目:

- MySQL/PostgreSQL + ORM + 迁移工具 + 连接池。

【九、常见坑】

- 只会 ORM,不会看 SQL。

- 在循环里查数据库,造成 N+1。

- 忘记提交事务。

- 查询大量数据时一次性 `.all()`,导致内存压力大。

- 模型字段改了,但忘记生成迁移。

- 线上直接手改表结构,迁移记录混乱。

更多推荐