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

深入理解 Flask ORM:用 SQLAlchemy 优雅操作数据库


一、前言:什么是 ORM?为什么要用它?

传统数据库操作要写 SQL,比如:

SELECT * FROM users WHERE id = 1;

而使用 ORM 后,你可以这样写:

user = User.query.get(1)

ORM 的优势:

  • 可读性强:更符合 Python 编程风格
  • 更安全:自动防止 SQL 注入
  • 更易维护:模型即数据结构,不需要手写 SQL
  • 便于迁移和扩展:跨数据库兼容性强

二、Flask 中使用 SQLAlchemy 的 ORM

首先你需要安装扩展:

pip install flask flask_sqlalchemy

三、快速入门:定义模型

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = 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
>>> from app import db
>>> db.create_all()

四、字段类型详解(Column Types)

类型含义
Integer整数
String(length)字符串
Text长文本
Boolean布尔值
Date / DateTime日期/日期时间
Float / Numeric浮点 / 精确小数

你还可以传入参数控制字段约束:

nullable=False     # 非空
unique=True        # 唯一约束
default='value'    # 默认值

五、常见 ORM 查询操作(CRUD)

1. 增(Create)

user = User(username='alice', email='alice@example.com')
db.session.add(user)
db.session.commit()

2. 查(Read)

# 查询所有用户
User.query.all()# 查询第一个
User.query.first()# 条件查询
User.query.filter_by(username='alice').first()# 主键查询
User.query.get(1)

3. 改(Update)

user = User.query.get(1)
user.email = 'new@example.com'
db.session.commit()

4. 删(Delete)

db.session.delete(user)
db.session.commit()

六、模型之间的关系建模(重点)

1. 一对多关系(User -> Post)

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')

使用方式:

user = User.query.first()
for post in user.posts:print(post.title)

2. 多对多关系

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')

七、模型中的方法与属性

你可以在模型中添加自定义方法:

class User(db.Model):...def is_email_valid(self):return '@' in self.email

八、数据库迁移:保持模型与数据库结构一致

使用 Flask-Migrate 可以自动生成迁移脚本。

pip install flask-migrate

在 app.py 中初始化:

from flask_migrate import Migratemigrate = Migrate(app, db)

命令行使用:

flask db init
flask db migrate -m "Initial"
flask db upgrade

九、项目结构建议(大中型项目)

推荐将模型拆分至 models/ 文件夹中,并使用工厂函数初始化 Flask 应用。

结构如下:

project/
├── app/
│   ├── __init__.py   ← 创建 Flask 实例
│   ├── models/
│   │   ├── __init__.py
│   │   ├── user.py
│   │   └── post.py

十、最佳实践总结

  • 使用 Flask-SQLAlchemy 管理模型与数据库
  • db.relationship() 管理表之间的联系
  • 用 Flask-Migrate 管理数据库结构变更
  • 模型即数据结构,推荐优先设计模型
  • 注意避免循环引用(尤其在关系定义中)

十一、结语与扩展学习方向

通过本篇内容,你应该已经掌握:

  • ORM 基础与模型定义
  • 常用字段与关系建模
  • 数据库查询与事务操作
  • 使用 Flask-Migrate 实现数据库迁移

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88600.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

源表=电源+数字表?一文看懂SMU源表 2025-04-14

源表(Source Meter Unit, SMU)广泛用于半导体器件、材料、医疗、发光器件与光通信等行业,测量器件的伏安(I-V)特性曲线、绝缘材料的电阻值(电阻率)、电容的绝缘电阻(漏电流)、光电器件的暗电流或者L-I-V等。 源表的名称已经清晰的告诉我们,它包含了高精度电源输出和…

单片机STM32F103:DMA的原理以及应用

STM32F103系列微控制器&#xff08;基于ARM Cortex-M3内核&#xff09;集成了**DMA&#xff08;Direct Memory Access&#xff0c;直接内存访问&#xff09;**控制器&#xff0c;用于在存储器与外设、存储器与存储器之间高效传输数据&#xff0c;减少CPU的干预&#xff0c;从而…

Webview 中可用的 VS Code 方法

在 VS Code Webview 的 HTML 中&#xff0c;不能直接调用 VS Code 的 API&#xff08;如 vscode.window.showInformationMessage&#xff09;&#xff0c;但可以通过 acquireVsCodeApi() 获取一个受限的 vscode 对象&#xff0c;用于与插件主程序通信。以下是详细说明和示例&am…

Qt:布局管理器Layout

目录 布局管理器 QVBoxLayout QHBoxLayout QGirdLayout QFormLayout Spacer 布局管理器 在以往的界面操作上&#xff0c;都是程序员手动拖动控件来布局&#xff0c;这种方式有一些不足之处&#xff0c;比如不能很好的把握控件之间的距离&#xff0c;以及控件的大小&…

【Java编程动手学】深入剖析Java网络编程:原理、协议与应用

文章目录一、引言二、计算机网络基础1、计算机网络的概念2、网络地址的重要性三、套接字编程&#xff1a;网络通信的基石1、套接字的概念2、TCP通信编程示例四、TCP通信编程&#xff1a;可靠的数据传输1、TCP协议的特点2、实际应用中的TCP通信五、UDP通信编程&#xff1a;高效的…

vue3.2 前端动态分页算法

文章目录背景思路页面情况核心代码小结效果背景 1. 后台接口只是动态返回一个数组的数据&#xff0c;前端需要根据数据量的大小判断是否需要分页&#xff0c;页面高度固定2. 页面根据页数大小有不同的展示a. 只有一页 头部 内容 统计 尾部b. 多页i. 第一页 头部 内容 尾…

UC浏览器PC版自2016年后未再更新不支持vue3

win uc浏览器&#xff0c;点击页面触发异常。UC浏览器PC版自2016年后未再更新&#xff08;最新版本停留在Chromium 50内核&#xff09;。其内置内核版本较低&#xff08;如Trident/Blink旧版&#xff09;&#xff0c;无法支持Vue 3等现代前端框架的语法特性&#xff08;如ES6、…

亚古数据:澳大利亚公司的ABN和ACN号码是什么?

在跨国商业的迷宫中&#xff0c;了解目标市场的公司注册细节是一项不可或缺的技能。对于与中国企业有业务往来的朋友们来说&#xff0c;澳大利亚这片充满机遇的土地上&#xff0c;两个缩写——ABN与ACN&#xff0c;如同解锁合作之门的密钥&#xff0c;显得尤为重要。今天&#…

LangChain框架 Prompts、Agents 应用

目录 (Prompts)提示作用 Prompts 常见操作 基础 PromptTemplate 使用 Few-shot 提示模板 ChatPromptTemplate (对话提示模板) (Agents)代理作用 Agents 常见操作 基础 Agent 使用 自定义工具 Agent 高级应用示例 带记忆的对话代理 使用本地模型的代理 结构化输出代…

模拟实现unordered_map

1.定义unordered_map 是 C 标准库中的哈希表容器&#xff0c;特点是无序存储、平均 O (1) 时间复杂度的插入 / 查找 / 删除操作。其核心原理是通过哈希函数将关键字映射到哈希桶&#xff08;bucket&#xff09;&#xff0c;再通过链表或红黑树处理哈希冲突。2.实现原理1. 哈希表…

史上最详细Java并发多线程(面试必备,一篇足矣)

第一章&#xff1a;线程基础 1.1 线程与进程 进程&#xff1a;系统资源分配的基本单位&#xff0c;拥有独立的内存空间 线程&#xff1a;CPU调度的基本单位&#xff0c;共享进程内存空间 关系&#xff1a;一个进程可包含多个线程&#xff0c;线程切换成本远低于进程 1.2 线程的…

【DataFlow】数据合成流水线工具

1.整体解读 核心思想&#xff1a;以数据为中心的AI&#xff08;Data-Centric AI&#xff09; DataFlow 的核心目标是通过一系列自动化“流水线”&#xff08;Pipelines&#xff09;来处理和生成高质量的数据&#xff0c;从而提升大语言模型&#xff08;LLM&#xff09;在特定领…

Hangfire 调用报错解决方案总结

System.ArgumentNullException: 值不能为 null 错误在使用 Hangfire 时确实是一个常见问题&#xff0c;特别是在配置 Hangfire 服务器时。问题分析这个错误通常发生在以下情况&#xff1a;没有正确配置 Hangfire 服务器队列配置缺失或不正确连接字符串配置问题解决方案要点正确…

MySQL的使用

MySQL的使用一、mysql中的周边命令1. 检查版本2. 查看字符集3. 查看客户端连接4. 查看最后一条警告消息二、数据库、数据表的管理1. 语法规则2. 数据库2.1 查看数据库2.2 创建数据库2.3 选择数据库2.4 查看创建数据库命令2.5 创建库时添加字符集2.6 修改数据库字符集2.7 删除数…

2025Nginx最新版讲解/面试

维护系统多服务器部署&#xff0c;将我们请求代理到各个服务器。代理正向代理&#xff0c;代理对象是我们的客户端&#xff0c;目标对象不知道我们用户。VPN就是典型的正向代理。反向代理&#xff0c;代理对象是服务端&#xff0c;用户不知道服务端具体信息。而这正是Nginx所做…

JAVASCRIPT 前端数据库-V8--仙盟数据库架构-—-—仙盟创梦IDE

老版本 在v1 版本中我们讲述了 基础版的应用 JAVASCRIPT 前端数据库-V1--仙盟数据库架构-—-—仙盟创梦IDE-CSDN博客 接下载我们做一个更复杂的的其他场景 由于&#xff0c;V1查询字段必须 id 接下来我们修改了了代码 JAVASCRIPT 前端数据库-V2--仙盟数据库架构-—-—仙盟创…

UNIX 域套接字实现本地进程间通信

&#x1f680; 使用 UNIX 域套接字 (AF_UNIX) 实现高效进程通信 在 Linux 和其他类 UNIX 系统中&#xff0c;进程间通信 (IPC) 的方法有很多种&#xff0c;例如管道、消息队列、共享内存等。然而&#xff0c;当你的应用程序需要在 同一台机器上的不同进程间进行高效、低延迟的数…

【Axure教程】中继器间图片的传递

中继器在Axure中可以作为图片保存的数据库&#xff0c;在实际系统中&#xff0c;我们经常需要将选择数据库的图片添加到其他图片列表中&#xff0c;所以今天就教大家&#xff0c;怎么在Axure中实现中继器之间的图片传递&#xff0c;包含将一个中继器中的图片列表传递到另一个中…

专题:2025云计算与AI技术研究趋势报告|附200+份报告PDF、原数据表汇总下载

原文链接&#xff1a;https://tecdat.cn/?p42935 关键词&#xff1a;2025, 云计算&#xff0c;AI 技术&#xff0c;市场趋势&#xff0c;深度学习&#xff0c;公有云&#xff0c;研究报告 云计算和 AI 技术正以肉眼可见的速度重塑商业世界。过去十年&#xff0c;全球云服务收…

从代码学习深度强化学习 - PPO PyTorch版

文章目录 前言PPO 算法简介从 TRPO 到 PPOPPO 的两种形式:惩罚与截断代码实践:PPO 解决离散动作空间问题 (CartPole)环境与工具函数定义策略与价值网络PPO 智能体核心实现训练与结果代码实践:PPO 解决连续动作空间问题 (Pendulum)环境准备适用于连续动作的网络PPO 智能体 (连…