SQLModel 数据库入门:从数据库概念到 SQL 关系模型的完整指南
ORM数据库后端【免费下载链接】sqlmodelSQL databases in Python, designed for simplicity, compatibility, and robustness.项目地址https://gitcode.com/gh_mirrors/sq/sqlmodel点击查看免费下载本指南基于 SQLModel 官方文档《Intro to Databases》整理面向刚接触数据库的开发者先讲清楚数据库是什么、为什么需要数据库、程序如何与数据库交互再深入 SQL 数据库的表、主键、外键、关系等核心概念最后落到 SQLModel 如何用 Python 对象替你完成与 SQL 数据库的通信。读完你将理解关系型数据库的基本原理并掌握 SQLModel 模型与数据库表、行、列之间的对应关系为后续建表、查询、写入等实战章节打下基础。什么是数据库数据库database常缩写为 DB是一个用于以结构化且高效的方式存储和管理数据的系统。数据库领域的信息量很大、理论性也很强这里只介绍几个核心概念其中还包括 SQLModel 不直接支持的 NoSQL 数据库类型以便你对数据库整体版图有一个清晰的认知。为什么需要数据库刚开始编程时你可能不觉得在程序代码之外单独搞一个数据库是个好主意——毕竟代码里已经有变量、字典、列表等数据结构它们不都在存数据吗关键在于你的代码本质上是静态的。运行时一旦启动程序就保持启动那一刻的状态即使你修改了代码程序也只会在下次运行时才发生变化。更关键的是程序终止后所有保存在内存中的数据都会消失。而大多数程序的目标恰恰是对程序之外的数据做处理可能是移动文件可能是读取用户在终端输入并重新展示也可能是一个接收数据并处理的 Web API。数据要么来自程序外部要么最终输出到程序外部。在多数情况下程序需要能够创建create、读取read、更新update、删除delete这些数据。你当然可以完全靠代码读写文件来完成这些操作这在简单场景下可行但对于数据更复杂、规模更大的系统这种策略并不高效你还要处理各种隐患保持数据同步、确保数据安全存储等。数据库正是为解决这些问题而设计的它让数据处理更高效并且与你的代码相互独立 ✨。如何与数据库交互数据库种类繁多按程序与数据文件的交互方式大致可以分为三类单文件数据库数据库可以就是一个名为heroes.db的单个文件由代码以非常高效的方式进行管理。典型例子就是SQLite。服务器数据库数据库也可以是以应用程序形式运行在服务器上的系统内部以优化过的格式管理多个文件。它就像一个 Web 服务器但使用自定义的、非常高效的通信协议——这也是最常见的数据库交互形态。此时你的代码不再直接读写数据文件而是与这个服务器程序对话。数据库可能位于另一台服务器/机器上也可能与你的程序位于同一台服务器/机器上这类数据库最重要的特征是你的代码不直接读写包含数据的文件而是与数据库应用通信由数据库应用真正地读写它的数据文件——因为数据库应用通常比你的代码高效得多。PostgreSQL、MySQL、MongoDB都是这种工作方式的例子。分布式服务器某些情况下数据库甚至是一组运行在不同机器上的服务器应用它们互相协作、彼此通信从而更高效地处理更多数据。此时你的代码会与其中一台或多台服务器应用对话。大多数以服务器应用形式运行的数据库都以某种方式支持多服务器。不过分布式系统会带来额外的挑战所以你大概率会先从单服务器应用或单文件数据库开始上手。SQL 数据库与 NoSQL 数据库除了交互方式还有一种非常重要的分类维度。数据库大致可分为两大阵营SQL 数据库和NoSQL 数据库。SQLModel 是用于 SQL 数据库的工具它无法在 NoSQL 数据库上提供太多帮助虽然官方文档也简要介绍了 NoSQL 的概念。后面会解释 SQL 这个名字的由来以及 SQL 数据库也叫关系型数据库的内部结构。关系型数据库的由来很久以前有人意识到一种很好的数据存储方式把数据放进不同的表table里。所谓表就是像单个电子表格那样的网格由不同的列column和行row组成。每一行代表一个具体的条目或记录record每一列代表该记录的一个具体属性attribute或字段field。单张大表的例子假设我们要存储一些英雄heroes的数据。如果用单张表存放所有英雄可能是这样idnamesecret_nameageteamheadquarters1DeadpondDive WilsonnullZ-ForceSister Margarets Bar2Spider-BoyPedro ParqueadornullPreventersSharp Tower3Rusty-ManTommy Sharp48PreventersSharp Tower但单表会带来一系列问题数据冗余导致的更新不一致假设把 Sharp Tower 改名为 Preventers Tower需要在两处更新。如果代码更新到一半时突然断电就可能出现一半是 Preventers Tower、一半还是 Sharp Tower 的不一致状态。数据完整性难以保证新增一个属于 Z-Force 团队的英雄 Mahjong 时可能手误写成 Y-Force 这种不存在的团队名。表达能力不足如果一个英雄同时属于两个团队单张大表根本没有简单的方式来表达这种多对多关系。拆分为多张表这些问题可以用多张表更好地解决不再用一张表装下所有数据而是分别为英雄heroes和团队teams建表再用某种方式把两者连接起来。团队表teams看起来像这样idnameheadquarters1PreventersSharp Tower2Z-ForceSister Margarets Bar英雄表heroes基本保持原样但新增一列team_id用来表示每一行每一个英雄属于哪个团队idnamesecret_nameageteam_id ✨1DeadpondDive Wilsonnull2 ✨2Spider-BoyPedro Parqueadornull1 ✨3Rusty-ManTommy Sharp481 ✨主键Primary Key上例中每一行都有一个ididentification 的缩写。每个id在表内唯一用于标识特定的行。SQL 数据库要求表内每一行都有唯一的标识方式——可以是一组唯一组合的列但通常就是单独一列这就是表的 主键primary key。主键常常是一个由数据库自动生成的整数列很多情况下这一列就叫id。注意主键只需要在同一张表内唯一。两张不同的表可以拥有相同的 ID——比如上面的 teams 表里 ID2是 Z-Forceheroes 表里 ID2是 Spider-Boy只要每张表内各有一个就行。外键Foreign Key既然主键 ID 能唯一标识 teams 表中的每一行我们就可以回到 heroes 表引用 teams 表中的这些 IDheroes 表中的team_id列定义了到 teams 表外部表的关系team_id的每个取值都对应 teams 表id列某一行的值。在 heroes 表中id是主键而team_id引用的是另一张表foreign table中的键这种列的技术术语就叫 外键foreign key。关系Relation与关系型数据库这些表的学术术语是 关系relation。注意这不是英文里事物之间相互关联那个日常含义尽管这些表之间确实互相关联关系在这里仅仅指每一张表。正因为这个术语SQL 数据库也被称为关系型数据库Relational Databases——这其实是更严谨的技术叫法本质上就是指由多张表构成的这类数据库。SQL —— 一门语言在提出多表存储思想之后人们又发明了一门与这些表交互的语言名为SQL全称Structured Query Language结构化查询语言。不过 SQL 不只是用来查询数据还用于创建记录/行、更新、删除以及操纵数据库本身如建表等。所有处理多张表的数据库都支持这门语言因此它们统称为SQL 数据库不过每种数据库对 SQL 的支持都有细微差别即各自的方言 dialect。例如假设存英雄的表叫hero一条取出全部数据的 SQL 查询是SELECT * FROM hero;该查询会返回 hero 表的所有数据idnamesecret_nameageteam_id1DeadpondDive Wilsonnull22Spider-BoyPedro Parqueadornull13Rusty-ManTommy Sharp481SQLModel 与 SQLSQLModel是一个帮助你用常规 Python 对象写代码、再把它们转换成发送给SQL 数据库的SQL 语句的库随后它接收返回的数据并放回你可以在代码中继续使用的 Python 对象里。SQLModel 只与 SQL 数据库打交道这也是本仓库文档其余部分的主角。从概念到代码SQLModel 如何映射数据库SQLModel 的官方文档明确指出SQLModel 构建在 SQLAlchemy 之上本质上是 SQLAlchemy 与 Pydantic 混合后再加一些糖。这一点在仓库源码中可以直接验证sqlmodel/main.py 中SQLModelMetaclass同时继承 Pydantic 的ModelMetaclass和 SQLAlchemy 的DeclarativeMetasqlmodel/main.py 中class SQLModel(BaseModel, metaclassSQLModelMetaclass, registrydefault_registry)表明 SQLModel 模型本身就是一个 Pydantic 模型sqlmodel/init.py 中的create_engine直接来自sqlalchemy.engine说明引擎体系完全复用 SQLAlchemy。用 Python 类表示一张表回顾官方文档首页的快速示例定义一个 SQL 表对应的 Python 模型只需from sqlmodel import Field, SQLModel class Hero(SQLModel, tableTrue): id: int | None Field(defaultNone, primary_keyTrue) name: str secret_name: str age: int | None Noneclass Hero(SQLModel, tableTrue)继承SQLModel并配置tableTrue告诉 SQLModel 这是一个表模型对应数据库中的一张表每个类属性对应一个表列。id: int | None Field(defaultNone, primary_keyTrue)声明主键。数据库里id由数据库自动生成所以在 Python 代码中它可能暂时是None直到保存进数据库才有值。age: int | None None类型为int | None意味着该列允许NULLSQL 中对应 Python 的None默认值为None则意味着该字段非必填。这个Hero类既是 SQLAlchemy 模型可与其他 SQLAlchemy 模型混用便于迁移旧项目也是 Pydantic 模型可借助继承避免代码重复、与 FastAPI 无缝配合。上述代码的完整可运行版本见 docs_src/tutorial/create_db_and_table/tutorial001_py310.py。Field 中的数据库相关参数在主键/外键等概念落到代码时Field()提供了与数据库直接相关的参数见 sqlmodel/main.py 的类型签名参数作用对应数据库概念primary_keyTrue将该列标记为主键主键Primary Keyforeign_keyteam.id声明指向另一张表的外键外键Foreign Keynullable控制列是否允许NULL可空性NULL 约束unique要求列值唯一唯一约束index为该列创建数据库索引索引sa_type/sa_column_args/sa_column_kwargs透传底层 SQLAlchemy 列类型与参数列的数据类型等可以看到主键、外键、关系这些本文介绍的概念在 SQLModel 中都有直接的、与之一一对应的声明方式。更完整的建表流程engine 的创建、SQLModel.metadata.create_all()的调用、数据库 URL 写法、echoTrue调试等可继续阅读 docs/tutorial/create-db-and-table.md。NoSQL 数据库虽然 SQL 数据库是最古老、最常用的数据库类型但还有另一类同样很有意思的数据库NoSQL 数据库。它涵盖了多种不同的子类型包括键值存储key-value stores、文档存储document stores、图数据库graph databases等。再次强调SQLModel 只能帮助你处理 SQL 数据库所以本仓库文档的其余部分都围绕 SQL 数据库展开。小结本文从什么是数据库出发讲清了程序需要数据库的根本原因内存数据易失、文件读写难以应对复杂数据梳理了单文件SQLite、服务器PostgreSQL/MySQL/MongoDB、分布式三种交互形态并重点拆解了 SQL 关系型数据库的骨架表即关系行即记录主键唯一标识行外键连接不同表SQL 则是与这些表打交道的语言。最后通过源码验证了 SQLModel Pydantic SQLAlchemy 这一技术底座并展示了如何用SQLModel类、Field()参数把上述概念映射成 Python 代码。接下来可以顺着 docs/tutorial/index.md 的教程动手创建你的第一张表和第一个数据库。赞分享ORM数据库后端【免费下载链接】sqlmodelSQL databases in Python, designed for simplicity, compatibility, and robustness.项目地址https://gitcode.com/gh_mirrors/sq/sqlmodel点击查看免费下载相关推荐Web 开发者的数据库入门指南从关系型数据库到 SQL 基础Web 开发者的数据库入门指南从关系型数据库到 SQL 基础 数据库是每一款 Web 应用最底层、也最核心的组件。无论你是在构建一个博客、一个电商网站还是一个文档教程教育数据库与 SQL 入门The Odin Project 课程中的关系数据库核心概念与实战数据库与 SQL 入门The Odin Project 课程中的关系数据库核心概念与实战 数据库是 Web 应用的底层基石负责替你记住一切用户数据——从登录文档教程教育DLSS Swapper免费切换 DLSS 版本DLSS Swapper免费切换 DLSS 版本 游戏更新后 DLSS深度学习超采样出现伪影或性能回退又不想等官方修复DLSS Swapper 是一款桌面应用上一篇使用GoFiber框架实现HTTPS与TLS安全通信下一篇nest_asyncio 快速入门5分钟掌握Python异步嵌套事件循环技术创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Semantic Kernel中Python原生函数参数处理最佳实践

Semantic Kernel中Python原生函数参数处理最佳实践

1. 项目概述作为一名长期从事AI应用开发的工程师,我发现很多开发者在初次接触Semantic Kernel时,对于如何正确编写Python原生函数存在不少困惑。特别是当涉及到参数传递时,单参数和多参数的处理方式差异常常成为项目推进的绊脚石。本文将基于…

2026/9/21 23:20:17 阅读更多 →
react-admin 表单数据防丢失:`<AutoPersistInStoreBase>` 自动保存组件原理与实战指南

react-admin 表单数据防丢失:`<AutoPersistInStoreBase>` 自动保存组件原理与实战指南

前端UI组件 【免费下载链接】react-admin A frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design 项目地址: https://gitcode.com/gh_mirrors/re/react-admin 点击查看 免费下载 是 react…

2026/9/21 23:19:16 阅读更多 →
在 VSCode 上如何修改 json 配置文件,从而构建调试 C/C++ 项目

在 VSCode 上如何修改 json 配置文件,从而构建调试 C/C++ 项目

本文介绍如何通过更改配置文件,从而在 VSCode 上构建调试 C/C 项目。 能够解决的一些问题:头文件未包含而导致的未定义;头文件未能被识别而显示的提示错误等问题。 一、基本设置 vscode 上调试构建 c/cpp 项目都是基于这个拓展包,…

2026/9/21 23:19:16 阅读更多 →

最新新闻

华为机试题实战:5个高频面试题代码解析与避坑指南

华为机试题实战:5个高频面试题代码解析与避坑指南

华为机试题实战:5个高频面试题代码解析与避坑指南 看了一堆教程还是不会写项目?别急,问题往往出在练习方式上。华为机试不是背题,而是考察你能否在限定时间内解决实际问题。这里整理了5道 高频面试题 ,带你从零搭建解题框架,直接上手写代码。…

2026/9/22 0:03:42 阅读更多 →
AllData集成Crater:构建异构算力资源池,实现训推一体化

AllData集成Crater:构建异构算力资源池,实现训推一体化

每次数据平台版本更新,我最关心的反而不是那些花哨的BI报表功能,而是底层算力这块有没有实质动作。这次AllData数据中台宣布集成开源项目Crater,方向算是踩在了大模型时代的命门上——把GPU、CPU、内存、磁盘这些原本分散的异构算力资源统一纳…

2026/9/22 0:03:42 阅读更多 →
微信拉黑后删除避坑指南:从入门到精通的实战经验

微信拉黑后删除避坑指南:从入门到精通的实战经验

微信拉黑后删除避坑指南:从入门到精通的实战经验 官方文档里关于消息队列状态同步的章节写得像天书,翻了三页还没搞懂缓存失效机制。很多应届生刚接手业务,总被【微信拉黑后删除】这种边缘场景搞得头秃,以为只是删个好友这么简单。其实这里的水深得很,涉…

2026/9/22 0:03:42 阅读更多 →
3个血泪坑:四级怎么算分完整示例避坑指南

3个血泪坑:四级怎么算分完整示例避坑指南

3个血泪坑:四级怎么算分完整示例避坑指南 看了一堆教程还是不会写项目?别怪自己笨,是那些教程只教你“怎么算”,没教你“怎么落地”。今天这篇关于 四级怎么算分 的 完整示例…

2026/9/22 0:03:42 阅读更多 →
漫天花雨特效踩坑全记录:3个致命错误与完整示例

漫天花雨特效踩坑全记录:3个致命错误与完整示例

漫天花雨特效踩坑全记录:3个致命错误与完整示例 官方文档翻了三遍还是报错?别慌,不是你笨,是文档太碎,抓不住重点。 做前端特效最怕这种"漫天花雨"效果,看着简单,一写代码就炸。 今天直接上 完整示例…

2026/9/22 0:03:42 阅读更多 →
3天搞定CK1997:图解原理带你从零搭建高可用后端

3天搞定CK1997:图解原理带你从零搭建高可用后端

3天搞定CK1997:图解原理带你从零搭建高可用后端 版本升级后 API 全变了,这大概是很多开发者接手老项目时的第一反应。以前熟悉的接口调用方式,在 CK1997…

2026/9/22 0:02:42 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →