尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SQLModel 数据库入门:从数据库概念到 SQL 关系模型的完整指南

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),仅供参考
返回列表