Flask-SQLAlchemy核心概念:模型类与数据库表、类属性与表字段、外键与关系映射

前置阅读,关于Flask-SQLAlchemy支持哪些数据库及基本配置,链接:Flask-SQLAlchemy_数据库配置

摘要

本文以一段典型的 SQLAlchemy 代码示例为引入,阐述以下核心概念:

  1. 模型类(Model Class) ↔ 数据库表(Database Table)
  2. 类属性(db.Column) ↔ 表字段(Table Columns)
  3. 外键(ForeignKey) ↔ 关系映射(relationship)

通过集中解释属性定义、关系概念与示例,帮助读者快速掌握 SQLAlchemy 在 Flask 应用中的基本用法。


1. 代码示例

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime# 初始化 Flask 应用
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'  # 使用 SQLite 数据库
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 初始化 SQLAlchemy
db = SQLAlchemy(app)# 用户模型(映射 user 表)
class User(db.Model):id            = db.Column(db.Integer, primary_key=True)username      = db.Column(db.String(50), unique=True, nullable=False)password_hash = db.Column(db.String(255), nullable=False)posts         = db.relationship('Post', backref='author', lazy='select')# 内容模型(映射 post 表)
class Post(db.Model):id          = db.Column(db.Integer, primary_key=True)content     = db.Column(db.Text, nullable=False)create_time = db.Column(db.DateTime, default=datetime.utcnow)user_id     = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)# 创建所有模型对应的数据库表
with app.app_context():db.create_all()

2. 核心概念

2.1 模型类(Model Class) ↔ 数据库表(Database Table)

  • 每个继承自 db.Model 的类都对应一张数据库表,默认表名为类名小写(如 User 类对应 user 表)。
  • 在执行 db.create_all() 时,SQLAlchemy 会检查数据库中是否存在对应的表:若表不存在则根据模型定义创建新表;若表已存在,则不会对其进行修改或删除,从而保证不会重复创建或覆盖已有数据。

2.2 类属性(db.Column) ↔ 表字段(Table Columns)

在 SQLAlchemy 中,通过 db.Column() 在模型类中定义字段,其调用签名为:

db.Column(type_, *args, **kwargs)
  • type_:字段的数据类型,如 db.Integerdb.String(长度)db.Textdb.DateTime 等。

  • *args:可选位置参数,如 db.ForeignKey('表名.字段名')

  • **kwargs:关键字参数控制字段约束与行为,包括:

    • primary_key=True:主键。
    • unique=True:唯一约束。
    • nullable=False:非空约束。
    • default=...:Python 层面的默认值。
    • server_default=text('...'):数据库层面的默认值(需导入 from sqlalchemy import text)。
    • index=True:创建索引。
    • autoincrement=True:整型主键自动递增。
    • comment='...':列注释。
    • doc='...':ORM 文档字符串。

2.3 外键(ForeignKey) ↔ 关系映射(relationship)

2.3.1 外键(ForeignKey)
  • 外键 是关系型数据库中用于维护表间引用完整性的约束机制,本质是一张表(子表)中的列,其值必须匹配另一张表(父表)中某列(通常是主键)的有效值。
  • 需要通过 db.Column 中传入 db.ForeignKey('目标表.目标列') 来定义,对应数据库表中的一列

示例

# Post 模型中的外键字段,定义为类属性,映射到数据库表的 user_id 列
user_id = db.Column(db.Integer,db.ForeignKey('user.id'),   # 在 Column 中声明外键nullable=False
)
2.3.2 关系映射(relationship)
  • 关系映射 用于在模型之间建立对象关联:它不在数据库中创建新列,而是为模型添加属性,方便在 ORM 中通过属性访问相关对象。

relationship('TargetModel', backref='reverse_attr', lazy=...),即可实现双向导航:

  • 目标模型名 ('TargetModel'):指定关联的模型类名称(字符串形式)。
  • backref 参数:在目标模型中创建反向属性 reverse_attr,可以自动关联到唯一外键。
  • lazy 参数:控制加载策略,如 select(默认,访问时发起查询)、joined(关联加载)、subquery 等。
示例:一对多关系
class User(db.Model):# ... 字段定义 ...posts = db.relationship('Post',         # 目标模型类名backref='author',  # 在 Post 中创建 author 属性lazy='select'      # 默认延迟加载)class Post(db.Model):# ... 字段定义 ...user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
  • posts 属性(“一”方)
    • user.posts 返回一个列表,包含该用户所有的 Post 对象。
  • author 属性(“多”方)
    • post.author 直接返回对应的 User 对象。

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

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

相关文章

野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(四)安装RKNN Toolkit2

RKNN Toolkit2是用来将onnx模型转成rknn专用模型,并可通过RKNN Toolkit Lite2或者RKNPU调用NPU进行加速计算的工具。 一开始我安装很多次都无法成功安装。后来跟售后技术对接,必须是PC平台的Linux环境才可以。我的电脑是windows,所以我需要用…

基于深度学习的工件检测系统设计与实现

在工业自动化领域,工件检测一直是提高生产效率和产品质量的关键环节。传统的人工检测方法不仅效率低下,而且容易受到主观因素的影响,导致误判率较高。随着深度学习技术的飞速发展,基于图像识别的自动检测系统逐渐成为研究热点。今…

CyberSecAsia专访CertiK首席安全官:区块链行业亟需“安全优先”开发范式

近日,权威网络安全媒体CyberSecAsia发布了对CertiK首席安全官Wang Tielei博士的专访,双方围绕企业在进军区块链领域时所面临的关键安全风险与防御策略展开深入探讨。 Wang博士在采访中指出,跨链桥攻击、智能合约漏洞以及私钥管理不当&#x…

Google C++ Style Guide 谷歌 C++编码风格指南,深入理解华为与谷歌的编程规范——C和C++实践指南

Google C 编程风格指南 Release Apr 07, 2017 0. ᡿享 ⡾ᵢ 4.45 ৕֒㘻 Benjy Weinberger, Craig Silverstein, Gregory Eitzmann, Mark Mentovai, Tashana Landray 㘱䈇 YuleFox, Yang.Y, acgtyrant, lilinsanity 亯ⴤѱ享 • Google Style Guide • Google 开源…

当科技邂逅浪漫:在Codigger的世界里,遇见“爱”

520,一个充满爱意的日子,人们用各种方式表达对彼此的深情。而在科技的世界里,我们也正经历着一场特别的邂逅——Codigger,一个分布式操作系统的诞生,正在以它独特的方式,重新定义我们与技术的关系。 Codigg…

嵌入式学习笔记 - Void类型的指针

void指针的基本概念和特性 void指针是一种特殊的指针类型,称为“无类型指针”或“通用指针”。它的主要特点是: ‌通用性‌:void指针可以指向任何类型的数据,这使得它在处理不确定数据类型时非常有用。 ‌灵活性‌:由…

【综述】视频目标分割VOS

相关连接 更新中....... 1、Associating Objects with Transformers for Video Object Segmentation:论文详解、AOT源码解析 2、Rethinking Space-Time Networks with Improved Memory Coverage for Efficient Video Object Segmentation 3、Recurrent Dynamic Embe…

001 嵌入式软件开发工程师实习篇面试——首战总结

2025年5月17日人生中第一次面试 紧张是藏不住的。但是不应该的。 目录 0.准备一份合适的自我介绍 1.结构体内存对齐问题 2.变量在内存中的存储模式 3.嵌入式中程序框架有哪些 4.程序代码设计要遵循什原则 5.版本号书写 6.单片机最小系统板有哪些组成 必须: 非必须:…

SIL2/PLd 认证 Inxpect毫米波安全雷达:3D 扫描 + 微小运动检测守护工业安全

Inxpect 成立于意大利,专注工业安全技术。自成立起,便致力于借助先进雷达技术提升工业自动化安全标准,解决传统安全设备在复杂环境中的局限,推出获 SIL2/PLd 和 UL 认证的安全雷达产品。 Inxpect 的雷达传感器技术优势明显。相较于…

Python数据可视化再探——Matplotlib模块 之一

目录 第一章 Matplotlib 模块教学内容​——基础图形绘制 一、Pyplot 子库介绍​ 1. 功能概述​ 2. 常用函数​ 二、绘制基本图形​ 1. 柱状图​ 2. 条形图​ 3. 折线图​ 4. 散点图​ 5. 面积图​ 6. 饼状图​ 7. 圆环图​ ​编辑 三、绘图知识点详解​ 1. 绘图…

智慧在线判题OJ系统项目总体,包含功能开发思路,内部中间件,已经部分知识点

目录 回顾一下xml文件怎么写 哪个地方使用了哪个技术 MyBatis-Plus-oj的表结构设计, 管理员登录功能 Swagger Apifox​编辑 BCrypt 日志框架引入(slf4jlogback) nacos Swagger无法被所有微服务获取到修改的原因 身份认证三种方式: JWT(Json Web Json,一…

使用Spring Boot和Spring Security构建安全的RESTful API

使用Spring Boot和Spring Security构建安全的RESTful API 引言 在现代Web应用开发中,安全性是至关重要的。Spring Boot和Spring Security是Java生态中广泛使用的框架,它们提供了强大的工具来保护RESTful API。本文将介绍如何结合Spring Boot和Spring S…

虚幻引擎5-Unreal Engine笔记之`GameMode`、`关卡(Level)` 和 `关卡蓝图(Level Blueprint)`的关系

虚幻引擎5-Unreal Engine笔记之GameMode、关卡(Level) 和 关卡蓝图(Level Blueprint)的关系 code review! 参考笔记: 1.虚幻引擎5-Unreal Engine笔记之GameMode、关卡(Level) 和 关卡蓝图&…

Java+Selenium+快代理实现高效爬虫

目录 一、前言二、Selenium简介三、环境准备四、代码实现4.1 创建WebDriver工厂类4.2 创建爬虫主类4.3 配置代理的注意事项 六、总结与展望 一、前言 在Web爬虫技术中,Selenium作为一款强大的浏览器自动化工具,能够模拟真实用户操作,有效应对…

SpringBoot配置文件的合并

需求:想分类将mysql数据库的配置放在一个文件,redis的配置放在另外一个文件 就不去引入mysql和redis了,看能否得到值就行了 测试结果 model的包放错了 应该移动到demo里 能否用yml或者yaml呢 这里注意yml的写法 测试结果也是可以的 注意如果主配置文件是yml或者yaml的话

深入理解 BFC:网页布局的关键机制

在前端开发的世界里,网页布局是一项至关重要的任务。而在众多布局相关的概念中,BFC(Block Formatting Context,块级格式化上下文)扮演着极为关键的角色。今天,就让我们深入剖析 BFC 的方方面面。 一、BFC …

04-Web后端基础(基础知识)

而像HTML、CSS、JS 以及图片、音频、视频等这些资源,我们都称为静态资源。 所谓静态资源,就是指在服务器上存储的不会改变的数据,通常不会根据用户的请求而变化。 那与静态资源对应的还有一类资源,就是动态资源。那所谓动态资源&…

Vue3 Element Plus el-table-column Sortable 排序失效

问题描述&#xff1a; vue3中 element plus 中 el-table 的 el-table-column使用了插槽后&#xff0c;为什么sortable不起效果&#xff0c;不能点击排序 <el-table-columnlabel"记账日期"width"110"fixed"left"header-align"left"…

Unity中SRP Batcher使用整理

SRP Batcher 是一种绘制调用优化,可显著提高使用 SRP 的应用程序的性能,SRP Batcher 减少了Unity为使用相同着色器变体的材质准备和调度绘制调用所需的CPU 时间。 工作原理: 传统优化方法通过减少绘制调用次数提升性能,而SRP Batcher的核心理念在于降低绘制调用间的渲染状…

服务器的基础知识

什么是服务器 配置牛、运行稳、价格感人的高级计算机&#xff0c;家用电脑不能比拟的。 服务器的组成&#xff1a;电源、raid卡、网卡、内存、cpu、主板、风扇、硬盘。 服务器的分类 按计算能力分类 超级计算机 小型机AIX x86服务器&#xff08;服务器cpu架构&#xff09; …