You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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默认选择逻辑。

修复:

  1. 保留原有配置导出结构,新增租户迁移执行脚本(如run-tenant-migrations.ts)。
  2. 在脚本中动态生成指定租户的配置,初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 10:43:14