Flask 入门到实战(2):用 SQLAlchemy 优雅操作数据库

深入理解 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='alice@example.com')
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 = 'new@example.com'
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 实现数据库迁移
相关推荐
编码者卢布15 分钟前
【Azure Storage Account】Azure Table Storage 跨区批量迁移方案
后端·python·flask
编码者卢布3 小时前
【Azure Developer】中国区Azure环境中查看用户账号是否可用(accountEnabled)的操作步骤
microsoft·flask·azure
她说..3 小时前
策略模式+工厂模式实现审批流(面试问答版)
java·后端·spring·面试·springboot·策略模式·javaee
编码者卢布3 小时前
【Azure APIM】如何实现对经过APIM并到达后端服务请求的全链路追踪呢?
python·flask·azure
梦梦代码精3 小时前
开源、免费、可商用:BuildingAI一站式体验报告
开发语言·前端·数据结构·人工智能·后端·开源·知识图谱
松树戈4 小时前
滥用AI生图引起的JavaScript heap out of memory排查记录
vue.js·ai编程
李慕婉学姐5 小时前
【开题答辩过程】以《基于Spring Boot的疗养院理疗管理系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·spring boot·后端
tb_first5 小时前
SSM速通2
java·javascript·后端
一路向北⁢5 小时前
Spring Boot 3 整合 SSE (Server-Sent Events) 企业级最佳实践(一)
java·spring boot·后端·sse·通信
测试_AI_一辰5 小时前
项目实践笔记13:多用户事实碎片 Agent 的接口测试与约束设计
开发语言·人工智能·ai编程