MikroORM多租户配置中的实体与迁移范围错误问题
NestJS + MikroORM多租户配置问题修复
问题1:租户实体路径错误
当前createTenantDbConfig错误加载了modules/shared下的共享实体,需改为指向租户业务实体目录(示例假设业务实体存于modules/tenant/**/entities/,可根据实际项目目录调整)。
修复:将entities和entitiesTs的路径替换为租户业务实体的对应路径。
问题2:租户迁移目录混淆
租户迁移文件当前存于database/migrations/shared/,逻辑上应与共享配置迁移分离,调整到database/migrations/client/,同时同步种子文件目录路径。
修复:修改migrations.path、migrations.pathTs、seeder.path、seeder.pathTs中的目录名从shared改为client。
问题3:CLI执行租户迁移困难
当前多导出结构导致MikroORM CLI默认加载共享配置,需通过自定义脚本加载租户配置并执行迁移,绕过CLI默认选择逻辑。
修复:
- 保留原有配置导出结构,新增租户迁移执行脚本(如
run-tenant-migrations.ts)。 - 在脚本中动态生成指定租户的配置,初始化MikroORM并执行迁移命令。
修正后的完整配置代码
import { defineConfig } from '@mikro-orm/core'; import { join } from 'path'; import { BaseConfig, isProdOrStaging, TSMigrationGenerator } from './base-config'; // 假设BaseConfig等定义在此文件 export const ConfigurationdbConfig = defineConfig({ ...BaseConfig, dbName: process.env.DB_NAME || 'shared_config', // 仅加载共享配置实体 entities: ['./dist/modules/configuration/**/entities/*.entity.js'], entitiesTs: ['./src/modules/configuration/**/entities/*.entity.ts'], migrations: { tableName: 'mikro_orm_migrations_config', path: join(process.cwd(), 'dist/database/migrations/config'), pathTs: join(process.cwd(), 'src/database/migrations/config'), glob: '!(*.d).{js,ts}', transactional: true, disableForeignKeys: false, allOrNothing: !isProdOrStaging, dropTables: !isProdOrStaging, safe: isProdOrStaging, snapshot: false, emit: 'ts', generator: TSMigrationGenerator, }, seeder: { path: join(process.cwd(), 'dist/database/seeders/config'), pathTs: join(process.cwd(), 'src/database/seeders/config'), defaultSeeder: 'ConfigSeeder', }, }); export const createTenantDbConfig = (db_name: string) => { return defineConfig({ ...BaseConfig, dbName: db_name, // 仅加载租户业务实体(替换为实际业务实体目录) entities: ['./dist/modules/tenant/**/entities/*.entity.js'], entitiesTs: ['./src/modules/tenant/**/entities/*.entity.ts'], migrations: { tableName: 'mikro_orm_migrations_client', path: join(process.cwd(), 'dist/database/migrations/client'), pathTs: join(process.cwd(), 'src/database/migrations/client'), glob: '!(*.d).{js,ts}', transactional: true, disableForeignKeys: false, allOrNothing: !isProdOrStaging, dropTables: !isProdOrStaging, safe: isProdOrStaging, snapshot: false, emit: 'ts', generator: TSMigrationGenerator, }, seeder: { path: join(process.cwd(), 'dist/database/seeders/client'), pathTs: join(process.cwd(), 'src/database/seeders/client'), defaultSeeder: 'clientSeeder', }, }); }; export default ConfigurationdbConfig;
租户迁移执行脚本示例(run-tenant-migrations.ts)
import { MikroORM } from '@mikro-orm/core'; import { createTenantDbConfig } from './path-to-your-config-file'; // 替换为配置文件实际路径 async function runTenantMigrations() { // 通过环境变量指定目标租户数据库名 const tenantDbName = process.env.TENANT_DB_NAME || 'tenant_001'; const orm = await MikroORM.init(createTenantDbConfig(tenantDbName)); const migrator = orm.getMigrator(); await migrator.up(); // 执行所有未应用的迁移 // 如需回滚迁移,可调用 await migrator.down(); await orm.close(true); } runTenantMigrations().catch(err => { console.error('租户迁移执行失败:', err); process.exit(1); });
执行脚本命令:
TENANT_DB_NAME=tenant_001 ts-node run-tenant-migrations.ts
内容的提问来源于stack exchange,提问作者Awais
相关产品推荐
相关产品推荐

