SQLAlchemy ORM (Flask-SQLAlchemy):告别原生 SQL,用 Python 对象管理 Flask 数据库
📂 所属阶段:第二阶段 — 交互与数据(核心篇)
🔗 相关章节:数据库关系设计 · environment-setup
1. ORM 是什么?一张对比图秒懂
如果你曾经写过这样的代码,拼接字符串拼到崩溃:
那 ORM(对象关系映射)会让你轻松很多。你只需要操作 Python 类和对象,剩下的交给它:
ORM 最大的好处:数据库无关性。将来想把 SQLite 换成 PostgreSQL,几乎不用改业务代码,换个配置连接串就行。
1.1 快速安装
如果使用 PostgreSQL 或 MySQL,记得装上对应的数据库驱动:
2. Flask-SQLAlchemy 基础配置
2.1 最小可用配置
为了避免循环导入,建议把扩展实例单独抽到一个文件(例如 app/extensions.py):
然后在应用工厂中绑定配置和 db 对象:
2.2 支持的数据库与连接池配置
不同的数据库只需要修改 SQLALCHEMY_DATABASE_URI 即可:
生产环境强烈建议配置连接池,避免频繁创建/销毁数据库连接:
3. 模型定义:把数据库表变成 Python 类
模型其实就是一种映射: Python 类 → 数据库表,类属性 → 表字段,类的实例 → 表中的一行。
3.1 用户模型(搭配 Flask-Login 的 UserMixin)
3.2 文章模型(带外键与级联删除)
3.3 常用字段类型速查
4. 上手 CRUD:增删改查快速入门
💡 所有操作都必须在 Flask 应用上下文中执行。在视图函数里自动有,如果要在终端测试,请加上
with app.app_context():。
4.1 创建(Create)
4.2 读取(Read)
最常用的几种查询姿势:
需要写原生 SQL 时的安全做法(不推荐频繁使用):
4.3 更新(Update)
4.4 删除(Delete)
5. 实用查询技巧
5.1 模糊搜索
5.2 IN 查询
5.3 AND / OR 组合
5.4 统计与聚合
6. 分页查询:告别手动 OFFSET / LIMIT
在博客或列表页中,分页是刚需。Flask-SQLAlchemy 提供了非常方便的分页器。
6.1 视图函数中分页
6.2 Jinja2 模板中的分页 UI
上面的例子只展示了基本页码,实际项目中可以进一步优化(比如添加省略号、只显示前后几页)。
7. 小结与最佳实践
7.1 常用操作速记
把最常用的会话、查询、更新、删除方法记在这里,随时查阅:
7.2 最佳实践建议
- 永远不要存储明文密码:使用
werkzeug.security的generate_password_hash和check_password_hash处理密码。 - 杜绝 SQL 注入:即使写原生 SQL,也要用
text()+ 字典传参,绝不拼接字符串。 - 时间统一用 UTC:后端存储一律使用
datetime.utcnow,展示时再根据用户时区转换。 - 模型拆分保存:将每个模型放在单独的文件(如
app/models/user.py),保持代码清爽。 - 善用数据库索引:在经常查询的字段上添加
index=True,unique=True会自动创建唯一索引,有效提升查询性能。
🔗 扩展阅读

