如何让Prisma 5生成Prisma 4风格的简洁模型类型?
生成Prisma 5风格的简洁模型类型方案
方法一:使用Prisma内置类型工具提取干净类型
Prisma 5提供了ModelNameGetPayload工具类型,传入空对象即可获取去掉泛型包装的基础模型类型,和Prisma 4的直观定义一致。
示例代码:
import { Prisma } from '@prisma/client'; // 提取User模型的简洁类型 type User = Prisma.UserGetPayload<{}>; // 提取Post模型的简洁类型 type Post = Prisma.PostGetPayload<{}>;
这个类型会自动包含模型的所有字段(包括关联字段的默认选择),结构和Prisma 4中直接定义的模型类型完全一致,可直接用于生成文档。
方法二:基于schema.prisma文件直接生成文档
如果不想依赖客户端的类型定义,可以直接解析原始的schema.prisma文件生成简洁的模型文档,避免受Prisma版本对客户端类型的影响。
大致实现步骤:
- 使用Node.js读取
schema.prisma文件内容 - 解析文件中的模型定义(可通过正则匹配或专用prisma schema解析库实现)
- 遍历每个模型的字段,提取字段名、类型、可选性、注释等信息
- 将提取的内容格式化为Markdown文档
示例解析逻辑(简化版):
const fs = require('fs'); const schemaContent = fs.readFileSync('./prisma/schema.prisma', 'utf-8'); // 匹配模型定义 const modelRegex = /model (\w+) {\n([\s\S]+?)\n}/g; let match; const models = []; while ((match = modelRegex.exec(schemaContent)) !== null) { const modelName = match[1]; const fields = match[2].trim().split('\n').map(line => { const [fieldName, type, ...rest] = line.trim().split(/\s+/); const isOptional = type.endsWith('?'); return { name: fieldName, type: isOptional ? type.slice(0, -1) : type, optional: isOptional, comment: line.includes('///') ? line.split('///')[1].trim() : '' }; }); models.push({ name: modelName, fields }); } // 生成Markdown let mdContent = '# 数据库模型文档\n'; models.forEach(model => { mdContent += `## ${model.name}\n`; mdContent += '| 字段名 | 类型 | 是否可选 | 注释 |\n'; mdContent += '|--------|------|----------|------|\n'; model.fields.forEach(field => { mdContent += `| ${field.name} | ${field.type} | ${field.optional ? '是' : '否'} | ${field.comment} |\n`; }); }); fs.writeFileSync('./model-docs.md', mdContent);
方法三:使用Prisma文档生成器
可以借助社区开发的Prisma文档生成器工具,直接基于schema生成结构化的简洁文档,无需手动处理类型定义。只需在schema.prisma中配置生成器,运行prisma generate即可生成对应的Markdown文档。
配置示例:
generator docs { provider = "prisma-docs-generator" output = "./docs/models.md" }
运行npx prisma generate后,指定路径下会生成包含所有模型简洁定义的Markdown文档。
内容的提问来源于stack exchange,提问作者Luisus
相关产品推荐
相关产品推荐

