使用Prisma迁移时,如何针对不同环境配置数据表操作规则?
Prisma迁移下区分生产/测试环境配置触发器的最佳实践
针对生产环境需禁止删改、测试环境允许操作的追加数据表需求,以下是几种实用的Prisma迁移方案:
方案1:迁移文件中嵌入环境变量条件判断(推荐)
Prisma支持在迁移SQL文件中使用环境变量进行条件执行,核心思路是仅在生产环境创建禁止删改的触发器。
操作步骤:
- 创建专门的触发器迁移文件(或在创建数据表的迁移文件末尾添加):
-- 定义禁止删改的函数 CREATE OR REPLACE FUNCTION prevent_update_delete() RETURNS TRIGGER AS $$ BEGIN RAISE EXCEPTION '该表为仅追加表,不允许更新/删除操作'; END; $$ LANGUAGE plpgsql; -- 仅在生产环境创建触发器 ${env:ENVIRONMENT = 'production'} CREATE TRIGGER trigger_prevent_update BEFORE UPDATE ON your_append_only_table FOR EACH ROW EXECUTE FUNCTION prevent_update_delete(); CREATE TRIGGER trigger_prevent_delete BEFORE DELETE ON your_append_only_table FOR EACH ROW EXECUTE FUNCTION prevent_update_delete();
- 设置环境变量:
- 生产环境:执行迁移时传入
ENVIRONMENT=production prisma migrate deploy - 测试环境:使用任意非
production值(如ENVIRONMENT=test prisma migrate deploy),此时触发器创建语句会被跳过
- 生产环境:执行迁移时传入
方案2:利用Seed脚本区分环境执行
如果不想在迁移文件中加入条件逻辑,可以通过Prisma的Seed脚本,仅在生产环境初始化触发器。
操作步骤:
- 在
prisma/seed.ts中编写环境判断逻辑:
import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); async function main() { const env = process.env.NODE_ENV; if (env === 'production') { // 生产环境创建触发器 await prisma.$executeRaw` CREATE OR REPLACE FUNCTION prevent_update_delete() RETURNS TRIGGER AS $$ BEGIN RAISE EXCEPTION '该表为仅追加表,不允许更新/删除操作'; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trigger_prevent_update BEFORE UPDATE ON your_append_only_table FOR EACH ROW EXECUTE FUNCTION prevent_update_delete(); CREATE TRIGGER trigger_prevent_delete BEFORE DELETE ON your_append_only_table FOR EACH ROW EXECUTE FUNCTION prevent_update_delete(); `; } } main() .catch(e => { console.error(e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });
- 执行流程:
- 生产环境:
prisma migrate deploy && prisma db seed - 测试环境:仅执行
prisma migrate deploy,跳过Seed脚本(或Seed脚本自动跳过触发器创建)
- 生产环境:
注意事项
- 确保环境变量在迁移/Seed执行时正确传递,避免测试环境误创建触发器
- 生产环境需验证触发器生效:尝试更新/删除数据,确认抛出预期异常
- 测试环境需验证操作权限:确保更新/删除操作可正常执行
内容的提问来源于stack exchange,提问作者Igor Loskutov
相关产品推荐
相关产品推荐

