深入理解 Flask ORM:用 SQLAlchemy 优雅操作数据库
一、前言:什么是 ORM?为什么要用它?
传统数据库操作要写 SQL,比如:
ini
SELECT * FROM users WHERE id = 1;
而使用 ORM 后,你可以这样写:
ini
user = User.query.get(1)
ORM 的优势:
- 可读性强:更符合 Python 编程风格
- 更安全:自动防止 SQL 注入
- 更易维护:模型即数据结构,不需要手写 SQL
- 便于迁移和扩展:跨数据库兼容性强
二、Flask 中使用 SQLAlchemy 的 ORM
首先你需要安装扩展:
pip install flask flask_sqlalchemy
三、快速入门:定义模型
py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f"<User {self.username}>"
初始化数据库:
python
python
>>> from app import db
>>> db.create_all()
四、字段类型详解(Column Types)
类型 | 含义 |
---|---|
Integer | 整数 |
String(length) | 字符串 |
Text | 长文本 |
Boolean | 布尔值 |
Date / DateTime | 日期/日期时间 |
Float / Numeric | 浮点 / 精确小数 |
你还可以传入参数控制字段约束:
py
nullable=False # 非空
unique=True # 唯一约束
default='value' # 默认值
五、常见 ORM 查询操作(CRUD)
1. 增(Create)
py
user = User(username='alice', email='[email protected]')
db.session.add(user)
db.session.commit()
2. 查(Read)
py
# 查询所有用户
User.query.all()
# 查询第一个
User.query.first()
# 条件查询
User.query.filter_by(username='alice').first()
# 主键查询
User.query.get(1)
3. 改(Update)
py
user = User.query.get(1)
user.email = '[email protected]'
db.session.commit()
4. 删(Delete)
py
db.session.delete(user)
db.session.commit()
六、模型之间的关系建模(重点)
1. 一对多关系(User -> Post)
py
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
content = db.Column(db.Text)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
user = db.relationship('User', backref='posts')
使用方式:
py
user = User.query.first()
for post in user.posts:
print(post.title)
2. 多对多关系
py
association = db.Table('association',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
users = db.relationship('User', secondary=association, backref='tags')
七、模型中的方法与属性
你可以在模型中添加自定义方法:
py
class User(db.Model):
...
def is_email_valid(self):
return '@' in self.email
八、数据库迁移:保持模型与数据库结构一致
使用 Flask-Migrate 可以自动生成迁移脚本。
md
pip install flask-migrate
在 app.py 中初始化:
py
from flask_migrate import Migrate
migrate = Migrate(app, db)
命令行使用:
csharp
flask db init
flask db migrate -m "Initial"
flask db upgrade
九、项目结构建议(大中型项目)
推荐将模型拆分至 models/
文件夹中,并使用工厂函数初始化 Flask 应用。
结构如下:
md
project/
├── app/
│ ├── __init__.py ← 创建 Flask 实例
│ ├── models/
│ │ ├── __init__.py
│ │ ├── user.py
│ │ └── post.py
十、最佳实践总结
- 使用 Flask-SQLAlchemy 管理模型与数据库
- 用
db.relationship()
管理表之间的联系 - 用 Flask-Migrate 管理数据库结构变更
- 模型即数据结构,推荐优先设计模型
- 注意避免循环引用(尤其在关系定义中)
十一、结语与扩展学习方向
通过本篇内容,你应该已经掌握:
- ORM 基础与模型定义
- 常用字段与关系建模
- 数据库查询与事务操作
- 使用 Flask-Migrate 实现数据库迁移