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

news2025/5/25 22:01:24

前置阅读,关于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.coloradmin.cn/o/2385638.html

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

相关文章

六、【前端启航篇】Vue3 项目初始化与基础布局:搭建美观易用的管理界面骨架

【前端启航篇】Vue3 项目初始化与基础布局:搭建美观易用的管理界面骨架 前言技术选型回顾与准备准备工作第一步:进入前端项目并安装 Element Plus第二步:在 Vue3 项目中引入并配置 Element Plus第三步:设计基础页面布局组件第四步…

C++ 前缀和数组

一. 一维数组前缀和 1.1. 定义 前缀和算法通过预处理数组,计算从起始位置到每个位置的和,生成一个新的数组(前缀和数组)。利用该数组,可以快速计算任意区间的和,快速求出数组中某一段连续区间的和。 1.2. …

细胞冻存的注意事项,细胞冻存试剂有哪些品牌推荐

细胞冻存的原理 细胞冻存的基本原理是利用低温环境抑制细胞的新陈代谢,使细胞进入一种“休眠”状态。在低温条件下,细胞的生物活动几乎停止,从而实现长期保存。然而,细胞在冷冻过程中可能会因为细胞内外水分结冰形成冰晶而受损。…

快速上手Linux火墙管理

实验网络环境: 主机IP网络f1192.168.42.129/24NATf2(双网卡) 192.168.42.128/24 192.168.127.20/24 NAT HOST-NOLY f3192.168.127.30/24HOST-ONLY 一、iptables服务 1.启用iptables服务 2.语法格式及常用参数 语法格式:参数&…

[创业之路-375]:企业战略管理案例分析 - 华为科技巨擘的崛起:重构全球数字化底座的超级生命体

在人类文明从工业时代(机械、电气、自动化)迈向数字智能(硬件、软件、算法、虚拟、智能)时代的临界点上,一家中国企业正以令人震撼的姿态重塑全球科技版图。从通信网络的底层架构到智能终端的生态闭环,从芯…

AI基础知识(05):模型提示词、核心设计、高阶应用、效果增强

目录 一、核心设计原则 二、高阶应用场景 三、突破性技巧 以下是针对DeepSeek模型的提示词设计思路及典型应用场景示例,帮助挖掘其潜在能力: 一、核心设计原则 1. 需求明确化:用「角色定位任务目标输出格式」明确边界 例:作为历…

推测解码算法在 MTT GPU 的应用实践

前言​ 目前主流的大模型自回归解码每一步都只生成一个token, 尽管kv cache等技术可以提升解码的效率,但是单个样本的解码速度依然受限于访存瓶颈,即模型需要频繁从内存中读取和写入数据,此时GPU的利用率有限。为了解决这种问题,…

Axure酒店管理系统原型

酒店管理系统通常被设计为包含多个模块或界面,以支持酒店运营的不同方面和参与者。其中,管理端和商户端是两个核心组成部分,它们各自承担着不同的职责和功能。 软件版本:Axure RP 9 预览地址:https://556i1e.axshare.…

写实交互数字人在AI招聘中的应用方案

随着科技的进步,越来越多的行业开始探索如何利用人工智能提升效率和服务质量。其中,写实交互数字人技术以其高度拟真的交互体验和丰富的情感表达能力,在人力资源领域特别是招聘环节中展现出了巨大潜力。本文将探讨写实交互数字人在AI招聘中的…

房贷利率计算前端小程序

利率计算前端小程序 视图效果展示如下&#xff1a; 在这里插入代码片 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…

在Visual Studio中进行cuda编程

首先下载与CUDA Toolkit匹配的Visual Studio版本 比如我的CUDA Toolkit版本是12.6&#xff0c;那么我可以使用2022的Visual Studio。 查看Toolkit版本 nvcc -V 配置 ok&#xff0c;让我们开始Visual Studio的nvcc编译器配置 参考例文https://github.com/apachecn/succinc…

Fastrace:Rust 中分布式追踪的现代化方案

原文链接&#xff1a;Fastrace: A Modern Approach to Distributed Tracing in Rust | FastLabs / Blog 摘要 在微服务架构中&#xff0c;分布式追踪对于理解应用程序的行为至关重要。虽然 tokio-rs/tracing 在 Rust 中被广泛使用&#xff0c;但它存在一些显著的挑战&#xf…

Linux云计算训练营笔记day13【CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM】

Linux云计算训练营笔记day13[CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM]] 目录 Linux云计算训练营笔记day13[CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM]]1.find练习2.vim高级使用2.1 命令模式:2.2 插入模式:2.3 末行模式: 3. vimdiff4. ping5.…

黑马Java基础笔记-15

Set 无索引&#xff0c;无序&#xff0c;不可重复 HashSet object类中默认hashCode的方法是根据地址值。 如果集合中存储的是自定义对象&#xff0c;必须要重写hashCode和equals方法。 底层原理 jdk8以前&#xff1a;数组 链表 jdk8及以后&#xff1a;数组 链表 红黑…

软件设计师“排序算法”真题考点分析——求三连

一、考点分值占比与趋势分析 综合知识题分值统计表 年份考题数量总分值分值占比考察重点2018222.67%时间复杂度/稳定性判断2019334.00%算法特性对比分析2020222.67%空间复杂度要求2021111.33%算法稳定性判断2022334.00%综合特性应用2023222.67%时间复杂度计算2024222.67%分治…

Visual Studio 2019/2022:当前不会命中断点,还没有为该文档加载任何符号。

1、打开调试的模块窗口&#xff0c;该窗口一定要在调试状态下才会显示。 vs2019打开调试的模块窗口 2、Visual Studio 2019提示未使用调试信息生成二进制文件 未使用调试信息生成二进制文件 3、然后到debug目录下看下确实未生成CoreCms.Net.Web.WebApi.pdb文件。 那下面的…

vue--ofd/pdf预览实现

背景 实现预览ofd/pdf超链接功能 业务实现 pdf的预览 实现方式&#xff1a; 直接使用 <iframe :src"${url}#navpanes0&toolbar0" /> 实现pdf的预览。 navpanes0 隐藏侧边栏toolbar0 隐藏顶部工具栏 使用pdf.js&#xff0c;代码先行&#xff1a; <tem…

Python 爬虫之requests 模块的应用

requests 是用 python 语言编写的一个开源的HTTP库&#xff0c;可以通过 requests 库编写 python 代码发送网络请求&#xff0c;其简单易用&#xff0c;是编写爬虫程序时必知必会的一个模块。 requests 模块的作用 发送网络请求&#xff0c;获取响应数据。 中文文档&#xf…

【MySQL】CRUD

CRUD 简介 CRUD是对数据库中的记录进行基本的增删改查操作 Create&#xff08;创建&#xff09;Retrieve&#xff08;读取&#xff09;Update&#xff08;更新&#xff09;Delete&#xff08;删除&#xff09; 一、新增&#xff08;Create&#xff09; 语法&#xff1a; I…

Spring Boot微服务架构(三):Spring Initializr创建CRM项目

使用Spring Initializr创建CRM项目 一、创建项目前的准备 访问Spring Initializr网站&#xff1a; 打开浏览器访问 https://start.spring.io/或者直接使用IDE&#xff08;如IntelliJ IDEA或Eclipse&#xff09;内置的Spring Initializr功能 项目基本信息配置&#xff1a; Proj…