Next.js 13 appDir中Prisma seed.ts的放置与Supabase数据填充方法
Next.js 13 App Dir 环境下 Supabase 种子数据填充方案
方法一:使用 Prisma 官方种子命令(推荐)
这是最规范的方案,直接利用 Prisma 原生机制,无需依赖 API 路由。
1. 编写种子数据脚本
在 prisma/seed.ts 中编写填充逻辑(确保为 ESM 格式):
import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); async function main() { // 示例:批量创建用户,替换为你的业务数据即可 await prisma.user.createMany({ data: [ { name: 'Alice', email: 'alice@example.com' }, { name: 'Bob', email: 'bob@example.com' }, ], skipDuplicates: true, // 避免重复插入已存在的数据 }); } main() .catch((err) => { console.error('种子数据填充失败:', err); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });
2. 修正 Package.json 配置
由于项目启用了 type: module,需调整 Prisma 种子命令的执行方式:
{ // ...其他原有配置 "prisma": { "seed": "tsx prisma/seed.ts" }, "devDependencies": { // 添加 tsx 依赖(比 ts-node 更适配 ESM) "tsx": "^3.12.6" } }
先安装依赖:npm install -D tsx
3. 执行种子填充
运行以下命令完成数据填充:
npx prisma db seed
如果需要在数据库迁移后自动执行种子脚本,可使用:
npx prisma migrate dev --seed
方法二:通过 App Router API 路由手动触发
适合需要在运行时手动触发填充的场景,生产环境需注意权限控制。
1. 创建 API 路由文件
在 app/api/seed/route.ts 中创建路由(App Router 要求 API 路由必须命名为 route.ts):
import { PrismaClient } from '@prisma/client'; import { NextResponse } from 'next/server'; const prisma = new PrismaClient(); // 仅允许 POST 请求触发填充 export async function POST() { try { // 执行种子数据逻辑 await prisma.user.createMany({ data: [ { name: 'Charlie', email: 'charlie@example.com' }, ], skipDuplicates: true, }); return NextResponse.json({ message: '种子数据填充成功' }, { status: 200 }); } catch (error) { return NextResponse.json({ error: '填充失败,请检查日志' }, { status: 500 }); } finally { await prisma.$disconnect(); } }
2. 触发填充
启动开发服务器:npm run dev,然后通过 POST 请求访问 http://localhost:3000/api/seed(可使用 curl、Postman 或前端按钮触发)。
关键注意事项
- 确保
prisma/schema.prisma中的数据源 URL 正确指向 Supabase 的 Postgres 连接地址。 - 种子脚本中务必加入重复数据判断(如
skipDuplicates),避免重复插入导致报错。 - 生产环境使用 API 路由方案时,需添加权限验证(如管理员令牌校验),防止恶意调用。
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

