Python 后端基础(九):ORM 框架到底解决什么问题,SQLAlchemy 和 Django ORM 怎么理解
很多初学 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()`,导致内存压力大。
- 模型字段改了,但忘记生成迁移。
- 线上直接手改表结构,迁移记录混乱。
更多推荐
所有评论(0)