Gel(EdgeDB)快速上手:用 Schema 语言为 Flashcards 应用建模数据
数据库图数据库关系型数据库【免费下载链接】edgedbGel supercharges Postgres with a modern data model, graph queries, Auth AI solutions, and much more.项目地址https://gitcode.com/gh_mirrors/ed/edgedb点击查看免费下载本篇技术指南是 GelEdgeDBQuickstart 系列的「数据建模Modeling the data」环节讲解如何为 Flashcards 闪卡应用定义第一个对象模型从 JSON 模拟数据出发写出包含Card与Deck两个对象类型的 Schema 文件并用链接link表达它们之间的一对多关系最后通过迁移命令把模型真正落到数据库。读完本文你将掌握 Gel Schema 语言中对象类型、必填属性、排他约束、目标删除策略on target delete allow的写法以及migration create/migrate/gel ui这一套完整的建模工作流能够独立为任意应用起步阶段设计数据模型。从 JSON 模拟数据到对象模型Flashcards 应用的数据模型很简单但足以体现 Gel Schema 语言的许多独有特性。在教程配套的模拟数据文件deck-edgeql.json中数据形态非常直观一个Card类型描述单张闪卡包含两个必填字符串属性front卡正面和back卡背面每个Deck牌组对象则包含零个或多个Card对象组成的列表。如果用 TypeScript 接口描述对应 Next.js 路径模型长这样interface Card { front: string; back: string; } interface Deck { name: string; description: string | null; cards: Card[]; }如果用 Pydantic 模型描述对应 FastAPI/Python 路径则是from pydantic import BaseModel from typing import List, Optional class CardBase(BaseModel): front: str back: str class Card(CardBase): id: str class DeckBase(BaseModel): name: str description: Optional[str] None class Deck(DeckBase): id: str cards: List[Card]注意一个细节Deck.description是可选的可为null而Card.front、Card.back是必填的。这两种约束在后续 Schema 定义中会分别对应「非必填属性」与「required必填属性」。定义第一个对象类型Card 与 Deck有了这个简单的模型作参照接下来把这些类型写入 Gel 项目的 Schema 文件dbschema/default.gel。可以看到Schema 中的类型与 JSON 模拟数据几乎一一对应module default { type Card { required order: int64; required front: str; required back: str; }; type Deck { required name: str; description: str; multi cards: Card { constraint exclusive; on target delete allow; }; }; };逐行解读这份 Schemamodule defaultGel 使用模块module组织 Schema 命名空间Quickstart 项目的对象默认定义在default模块中。仓库内的基础库如 edb/lib/schema.edgeql、edb/lib/std也都是以模块形式组织的。type Card定义对象类型。required关键字声明必填属性这里order用于排序的序号、front、back都是必填的。str和int64是内置标量类型。type Deckname必填description不写required即为可选属性可为空。multi cards: Cardmulti声明这是多值链接multi link表示一个Deck可以关联零个或多个Card——这就是典型的1 对 n关系。关于Card.order还有一个设计上的考虑当你查询Deck.cards链接时卡片返回的顺序是不确定的unordered因此Card类型需要一个显式的order属性供查询时按它排序。这是 Gel 中处理多值链接排序问题的标准做法。链接的排他约束与删除策略上面的 Schema 在cards链接上声明了两个行为它们来自 Gel 链接link机制的核心语义详见仓库中的 链接参考文档constraint exclusive保证每张卡只属于一个牌组constraint exclusive是排他约束它确保链接集合中的元素不重复。配合multi链接其实际效果是一张Card最多只能被一个Deck的cards链接引用从而让Deck → Card严格保持 1 对 n 关系而不是 n 对 n。这是 Gel 中表达多对一方向性的常用技巧。on target delete allow允许删除被链接的对象默认情况下当你想删除一个被其他对象链接的对象时数据库会阻止这次删除这是restrict策略。但我们希望支持删除任意一张Card因此需要在cards链接上显式声明删除策略。根据 链接参考文档on target delete子句决定了目标对象被删除时链接采取的动作可选值包括策略行为restrict默认目标被删除时抛出异常阻止删除delete source目标被删除时连带删除源对象级联删除allow目标被删除时将其从链接中移除deferred restrict类似restrict但把报错推迟到事务结束若对象仍被链接本例选择allow语义为删除Card时自动把它从所属Deck的cards链接中解除不影响牌组本身。此外链接还支持on source delete子句控制源对象被删除时的行为allow、delete target、delete target if orphan在本模型中未使用但了解这些策略有助于设计级联删除等更复杂的模型。创建并应用迁移把 Schema 落到数据库Schema 定义好之后它只是磁盘上的一个文件数据库还不知道Deck和Card的存在。要让 Gel 在数据库中真正创建这些类型需要两步操作创建迁移migration create迁移是一个包含底层指令集合的文件用于描述数据库 Schema 应该如何变化以数据库能够理解的方式记录对 Schema 的一切增、删、改。当你在修改已有 Schema时CLI 迁移工具可能会提问以确保它准确理解你的改动意图。由于当前数据库 Schema 还是空的CLI 会跳过提问直接生成迁移文件。应用迁移migrate在数据库上执行迁移文件指示 Gel 落实记录的所有改动确保Deck和Card类型被真正创建、可供使用。在 Next.js 项目中通过npx运行 Gel CLI$ npx gel migration create Created ./dbschema/migrations/00001-m125ajr.edgeql, id: m125ajrbqp7ov36s7aniefxc376ofxdlketzspy4yddd3hrh4lxmla $ npx gel migrate Applying m125ajrbqp7ov36s7aniefxc376ofxdlketzspy4yddd3hrh4lxmla (00001-m125ajr.edgeql) ... parsed ... applied Generating query builder... Detected tsconfig.json, generating TypeScript files. To override this, use the --target flag. Run npx gel/generate --help for full options. Introspecting database schema... Generating runtime spec... Generating cast maps... Generating scalars... Generating object types... Generating function types... Generating operators... Generating set impl... Generating globals... Generating index... Writing files to ./dbschema/edgeql-js Generation complete! 在 FastAPI/Python 项目中改用uvx$ uvx gel migration create Created ./dbschema/migrations/00001-m125ajr.edgeql, id: m125ajrbqp7ov36s7aniefxc376ofxdlketzspy4yddd3hrh4lxmla $ uvx gel migrate Applying m125ajrbqp7ov36s7aniefxc376ofxdlketzspy4yddd3hrh4lxmla (00001-m125ajr.edgeql) ... parsed ... applied迁移的底层流程仓库中的 迁移实现文档 详细描述了这一流程的内部机制有助于理解刚才发生了什么用户编辑dbschema目录下的.gel文件使文件描述的 Schema 与数据库实际 Schema 产生差异运行migration createCLI 读取.gel文件并发送给 Gel 服务器分析变更服务器生成迁移计划返回给 CLI若计划存在歧义CLI 与服务器会来回交互、以提问方式向用户确认直到计划清晰并获得批准CLI 把迁移计划写入dbschema/migrations目录下的新文件如00001-m125ajr.edgeql运行migrate把迁移应用到数据库把更新后的.gel文件和新生成的迁移文件一起提交到版本控制。从上述migrate命令的输出还能看到一个便利特性迁移应用成功后CLI 会自动运行脚本生成查询构建器query builder。对 TypeScript 项目来说它会检测到tsconfig.json向./dbschema/edgeql-js目录生成类型安全的客户端代码runtime spec、cast maps、scalars、object types、functions、operators、globals 等。这一自动化行为由gel.toml配置文件中的schema.update.after钩子hook开启。如果你不想在每次迁移后都自动生成可以在gel.toml中调整或移除该钩子配置。用内置 UI 可视化数据模型迁移完成后可以打开 Gel 自带的数据库内置 UI直观查看刚刚生成的 Schema。这个工具可以可视化你的数据模型让你看到定义的对象类型与链接关系# Next.js 项目 $ npx gel ui # FastAPI/Python 项目 $ uvx gel ui如上图所示UI 左侧是 Schema 编辑区default模块下的Card、Deck类型定义右侧是以图形化方式呈现的对象模型Deck拥有必填的name、可选的description以及指向Card的cards链接标注了on target delete allow与constraint exclusive约束Card则持有继承自基对象的id以及必填的back、front属性。代码定义与可视化图形一一对应是核对模型设计是否如预期的最佳工具。小结与下一步至此Flashcards 应用的数据模型已经完成从「JSON 模拟数据」到「Schema 文件」再到「数据库中的真实对象类型」的完整落地。回顾一下本篇的关键知识点用type定义对象类型用required声明必填属性str、int64等标量类型映射 JSON 中的基础数据类型用multi链接表达 1 对 n 关系配合constraint exclusive收紧为一卡一牌组的方向性语义用on target delete allow覆盖默认的restrict删除策略允许删除被链接的目标对象完整的策略矩阵见 链接参考文档用migration createmigrate两步把 Schema 变更落到数据库借助schema.update.after钩子自动生成类型安全查询构建器迁移机制详见 迁移实现文档用gel ui打开内置 UI 可视化、核对数据模型。数据模型就绪后可以继续 Quickstart 系列的下一环节学习如何连接数据库、操作数据增删改查以及更进阶的共享属性与继承建模如需系统学习 Schema 语言的完整语法可参阅 Schema 入门 与 数据模型参考。赞分享数据库图数据库关系型数据库【免费下载链接】edgedbGel supercharges Postgres with a modern data model, graph queries, Auth AI solutions, and much more.项目地址https://gitcode.com/gh_mirrors/ed/edgedb点击查看免费下载相关推荐Gel 官方 Next.js 快速上手指南5 分钟搭建 Flashcards 应用并接入 Gel 数据层Gel 官方 Next.js 快速上手指南5 分钟搭建 Flashcards 应用并接入 Gel 数据层 本教程来自当前仓库 docs/intro/quick数据库图数据库关系型数据库Gel 数据建模实战用 Gel Schema 语言为 FastAPI 闪卡应用定义 Card 与 Deck 数据模型Gel 数据建模实战用 Gel Schema 语言为 FastAPI 闪卡应用定义 Card 与 Deck 数据模型 本文是 Gel 官方 Quickstar数据库图数据库关系型数据库用 Gel 作为 FastAPI 数据层Flashcards 应用 5 分钟快速入门指南用 Gel 作为 FastAPI 数据层Flashcards 应用 5 分钟快速入门指南 本文是 Gel 官方快速入门Quickstart教程的完整中文解数据库图数据库关系型数据库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考