ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Wasp 0.12 教程解析:用 PSL 定义数据库实体 Task 并生成迁移

Wasp 0.12 教程解析:用 PSL 定义数据库实体 Task 并生成迁移 Wasp 0.12 教程解析用 PSL 定义数据库实体 Task 并生成迁移【免费下载链接】waspThe batteries-included full-stack framework for the AI era. Develop JS/TS web apps (React, Node.js, and Prisma) using declarative code that abstracts away complex full-stack features like auth, background jobs, RPC, email sending, end-to-end type safety, single-command deployment, and more.项目地址: https://gitcode.com/GitHub_Trending/wa/wasp本篇以 Wasp 官方 0.12 版教程的《4. Database Entities》一节为主线讲解如何在main.wasp文件中使用 Prisma Schema LanguagePSL定义Task实体以及如何通过wasp db migrate-dev和wasp db studio两个命令完成数据库表结构的变更与验证。读完本文你将能够独立定义 Wasp 实体、理解{psl ... psl}语法块的解析原理并掌握实体变更后的完整落地流程。实体是 Wasp 数据模型的基础实体Entity是 Wasp 中最核心的概念之一它决定了你的应用往数据库里存什么。Wasp 官方教程在构建 Todo App 时任务Task是应用的核心数据因此第一步就是定义Task实体。教程给出的定义如下// ... entity Task {psl id Int id default(autoincrement()) description String isDone Boolean default(false) psl}这段声明中entity Task告诉 Wasp 我们要定义一个名为Task的实体即数据库模型Wasp 会自动创建一张名为tasks的表而{psl ... psl}是 Wasp 的专属语法——两个psl标签之间的内容会被当作 Prisma Schema Language 来处理。教程同时点明了底层机制Wasp 使用 Prisma 作为与数据库对话的桥梁实体本质上就是 Prisma 数据模型Prisma model。你不需要先精通 PSL 就能上手但了解其结构会非常有帮助。逐字段理解 Task 模型上面的 PSL 定义描述了tasks表的三列官方 Entities 文档version-0.12 的 Entities 说明对每个字段做了详细解释id整型主键。id将其标记为主键default(autoincrement())表示数据库会在插入时自动递增生成无需手动赋值description字符串存放任务的描述文本isDone布尔值表示任务是否已完成。default(false)保证在创建任务时若未显式设置该字段数据库默认写入false。waspc 源码中的 PSL 解析从 waspcWasp 编译器Haskell 编写的源码结构看{psl ... psl}块的内容由一套完整的 PSL 解析器处理位于 waspc/src/Wasp/Psl/Parser/ 目录。其中 Model.hs 定义了model解析器对应model User { id Int id ... }这类结构即模型名后跟花括号包裹的字段与块级属性序列。值得注意的是Model.hs 中显式枚举了支持的标量类型——String、Boolean、Int、BigInt、Float、Decimal、DateTime、Json等并注释标明这些类型与 Prisma 官方类型定义一一对应。这解释了为什么教程示例中id Int、description String、isDone Boolean可以直接书写它们是 waspc 内置认可的 PSL 标量类型解析器会把它们转换为对应的内部 AST 节点Psl.Model.String、Psl.Model.Int、Psl.Model.Boolean等后续再交给 Prisma 生成数据库 DDL。让数据库结构同步wasp db migrate-dev定义实体后必须让实际数据库的表结构与声明保持一致。教程给出的操作流程是如果wasp start进程正在运行先停止它在终端中执行wasp db migrate-dev任何时候修改了实体的定义增删字段、改类型、加默认值都需要重新运行这个命令。它的作用是指示 Prisma 创建一份新的数据库迁移脚本migration并将其应用到数据库上。生成的迁移脚本会自动落在项目的migrations/目录下。官方 Entities 文档明确提醒这个目录应当提交到版本控制系统git中因为迁移脚本是数据库结构演进的完整历史记录。这一点在 Wasp 仓库的示例项目中可以直观看到例如 kitchen-sink 示例的 migrations 目录 中每个子目录都以时间戳命名如20250604115050_uppercase_text_job_request内含一份.sql迁移文件根目录还有migration_lock.toml记录锁定的数据库 provider——这正是wasp db migrate-dev反复执行后形成的目录形态。用 wasp db studio 验证 Task 表迁移应用成功后教程建议运行以下命令查看数据库wasp db studio该命令会在浏览器中打开 Prisma 的可视化管理页面可以查看和编辑数据库中的数据。此时点击Task表就能看到刚生成的三个字段id、description、isDone——虽然此时库里还没有任何数据但表结构已经就位为后续教程中的查询和操作Operations做好了准备。官方文档中展示的这一界面截图位于 web/static/img/todo-app-db-studio-task-entity.png呈现的正是 Db Studio 中Task实体三个字段的状态与本文流程一一对应。后续如何使用实体教程的结尾提示数据库里还没有数据但马上就会改变——接下来的章节将定义操作Operations来读写Task实体。结合 version-0.12 的 Entities 文档实体的完整工作流可以归纳为四步在.wasp文件中创建或更新实体定义运行wasp db migrate-dev同步数据库模型它通过生成迁移脚本完成同步将自动生成的migrations/目录提交进版本控制在实现操作Query 与 Action时使用 Wasp 的 JavaScript API 访问数据库。绝大多数场景下实体都会在 Query 和 Action 这类操作Operations的上下文中被使用。如果需要对数据库做更底层的控制也可以在 Wasp 的服务端代码中直接导入并使用 Prisma Clientimport { prisma } from wasp/server prisma.task.create({ description: Read the Entities doc, isDone: true // almost :) })需要注意Prisma Client 只能在 Wasp 的服务端代码中使用官方建议优先使用 Wasp 提供的常规机制仅在 Wasp 没有提供所需能力时才直接使用 Prisma Client。版本演进从 {psl} 内联定义到 schema.prisma教程示例基于 Wasp 0.12 的写法app TodoApp { wasp: { version: ^0.12.0 } }实体直接内联在main.wasp的{psl ... psl}块中。值得注意的是仓库中的最新示例项目已经演进到将数据模型外置到根目录的schema.prisma文件中。例如 TodoAppTs 示例的 schema.prismamodel Task { id Int id default(autoincrement()) description String isDone Boolean default(false) user User? relation(fields: [userId], references: [id]) userId Int? }字段定义与 0.12 教程中的Task实体完全同源id自增主键、description字符串、isDone默认false只是扩展了与User的关系字段并将 datasource 与 generator 配置一并声明在文件中。TodoAppTs 的 main.wasp.ts 中也不再内联 PSL而是通过query(getTasks, { entities: [Task] })等声明把操作与实体关联起来。如果你正在阅读新版 Wasp 文档这个迁移方向值得了解实体定义的方式从内嵌在 wasp 文件里变成了独立的 Prisma 模式文件但wasp db migrate-dev同步数据库的核心流程不变。小结实体用entity Task {psl ... psl}定义块内是标准 PSL 语法由 waspc 的 PSL 解析器waspc/src/Wasp/Psl/Parser/Model.hs解析为内部 AST最终由 Prisma 落成数据库表每次修改实体定义后必须停止wasp start并运行wasp db migrate-dev生成并应用迁移migrations/目录需纳入版本控制wasp db studio提供浏览器中的可视化数据管理页面可用于验证Task表结构实体主要通过 Query/Action 操作访问必要时可在服务端代码中直接导入prisma客户端做更底层的操作。【免费下载链接】waspThe batteries-included full-stack framework for the AI era. Develop JS/TS web apps (React, Node.js, and Prisma) using declarative code that abstracts away complex full-stack features like auth, background jobs, RPC, email sending, end-to-end type safety, single-command deployment, and more.项目地址: https://gitcode.com/GitHub_Trending/wa/wasp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进