如何使用Prisma针对不同Schema执行数据库迁移?
解决方案:多Prisma Schema的数据库迁移同步
首先纠正一个误解:Prisma Migrate 完全支持通过--schema参数指定非默认的Schema文件,你之前的命令可能缺少了Migrate的子命令(比如dev、deploy)——单独执行npx prisma migrate是无效的,必须跟具体的操作子命令。下面是几种更优雅的实现方式:
1. 直接在package.json中配置带--schema的脚本
这是最直接的方式,针对每个模块的Schema编写独立脚本,明确指定Schema路径和对应的数据库环境:
{ "scripts": { "sync-db-1": "DATABASE_URL=postgres://user:pass@localhost:5432/db-module-1 npx prisma migrate dev --schema ./prisma/moduleSchema1.prisma", "sync-db-2": "DATABASE_URL=mysql://user:pass@localhost:3306/db-module-2 npx prisma migrate deploy --schema ./prisma/moduleSchema2.prisma", "sync-db-test": "dotenv -e .env.test -- npx prisma migrate reset --schema ./prisma/moduleSchemaTest.prisma" } }
- 可以直接在脚本中硬编码
DATABASE_URL,或者用dotenv-cli加载对应模块的环境变量文件(需先安装:npm i -D dotenv-cli) - 根据场景选择合适的Migrate子命令:
dev用于开发环境(自动生成迁移文件),deploy用于生产/测试环境(执行已有的迁移文件),reset用于重置数据库
2. 编写批量迁移脚本(避免重复代码)
如果模块数量较多,不想在package.json中写大量重复脚本,可以编写一个简单的Node脚本批量处理:
// scripts/sync-all-dbs.js const { execSync } = require('child_process'); // 定义所有模块的Schema和对应的环境变量文件 const modules = [ { schemaPath: './prisma/moduleSchema1.prisma', envFile: './.env.module1' }, { schemaPath: './prisma/moduleSchema2.prisma', envFile: './.env.module2' }, { schemaPath: './prisma/moduleSchema3.prisma', envFile: './.env.module3' } ]; // 遍历执行迁移 modules.forEach(({ schemaPath, envFile }) => { console.log(`=== 开始迁移: ${schemaPath} ===`); try { // 用dotenv加载对应环境变量,执行migrate dev execSync( `dotenv -e ${envFile} -- npx prisma migrate dev --schema ${schemaPath} --skip-seed`, { stdio: 'inherit' } ); console.log(`=== 迁移完成: ${schemaPath} ===\n`); } catch (err) { console.error(`=== 迁移失败: ${schemaPath} ===`, err.message); process.exit(1); } });
然后在package.json中添加脚本:
{ "scripts": { "sync-all-dbs": "node scripts/sync-all-dbs.js" } }
这种方式可以统一管理所有模块的迁移逻辑,还能添加错误处理、日志输出等增强功能。
3. 利用Prisma Schema的环境变量引用
如果每个模块的Schema文件中已经通过env("DATABASE_URL_MODULE_1")这样的方式引用了不同的环境变量,可以在脚本中直接指定对应的环境变量:
比如Schema文件:
// moduleSchema1.prisma generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL_MODULE_1") } // ... 模型定义
然后package.json脚本:
{ "scripts": { "sync-db-1": "DATABASE_URL_MODULE_1=postgres://user:pass@localhost:5432/db1 npx prisma migrate dev --schema ./prisma/moduleSchema1.prisma" } }
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

