SQLAlchemy ORM (Flask-SQLAlchemy):告别原生 SQL,用 Python 对象管理 Flask 数据库
1. ORM 是什么?一张对比图秒懂
原生 SQL 开发者的日常,可能是盯着一堆字符串拼语法:
用 ORM(对象关系映射) 后,直接操作 Python 类和对象就行:
它最大的好处是数据库无关性——换数据库(比如从 SQLite 切到 PostgreSQL)时,几乎不用改业务代码,只需要调整配置 URI 即可。
1.1 快速安装
如果要用 PostgreSQL/MySQL,记得额外装驱动:
2. Flask-SQLAlchemy 基础配置
2.1 最小可用配置
先在项目中单独抽一个扩展初始化模块(推荐 app/extensions.py),避免循环导入:
然后在应用工厂里配置并绑定:
2.2 支持的数据库与进阶配置
生产环境必加连接池配置,避免频繁创建销毁连接:
3. 用 Python 类定义数据库模型
模型本质是 Python 类 ↔ 数据库表 的映射,类属性对应表字段,实例对应表行。
3.1 用户模型(带登录混合类)
这里结合 flask-login 的 UserMixin(提供默认的登录状态检查方法):
3.2 文章模型(带外键与级联)
3.3 常用字段类型速查
4. CRUD 操作速查(核心!)
CRUD 是数据库最常用的增 Create、查 Read、改 Update、删 Delete 操作。
💡 前提:必须在 Flask 应用上下文中执行——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. 分页功能(Flask-SQLAlchemy 内置超好用)
分页是博客、列表页的标配,不用自己写 LIMIT/OFFSET。
6.1 视图函数中的分页
6.2 Jinja2 模板中的分页 UI
7. 小结与最佳实践
7.1 核心速记
7.2 最佳实践
- 永远不要存明文密码:用
werkzeug.security的generate_password_hash和check_password_hash。 - 参数化查询:即使原生 SQL 也别拼字符串,用
text()+ 字典传参,防止 SQL 注入。 - 用 UTC 时间:
datetime.utcnow存储,前端再转成用户本地时间。 - 抽离模型:每个模型单独一个文件(放在
app/models/目录),避免代码臃肿。 - 加索引:
unique=True自动加唯一索引,常用查询字段(如username、email)手动加index=True,提升查询速度。
🔗 扩展阅读

