data-source.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import "reflect-metadata"
  2. import { DataSource, EntitySchema } from "typeorm"
  3. import process from 'node:process'
  4. // 实体目标类型,可以是类、函数或实体模式
  5. type EntityTarget = Function | EntitySchema<any> | string
  6. /**
  7. * 创建数据源配置
  8. * @param entities 实体类数组
  9. * @returns DataSource 实例
  10. */
  11. export function createDataSource(entities: EntityTarget<any>[]): DataSource {
  12. // 在测试环境下使用测试数据库配置
  13. const isTestEnv = process.env.NODE_ENV === 'test';
  14. const testDatabaseUrl = process.env.TEST_DATABASE_URL || 'postgresql://postgres:test_password@localhost:5432/test_d8dai';
  15. return isTestEnv && testDatabaseUrl
  16. ? new DataSource({
  17. type: "postgres",
  18. url: testDatabaseUrl,
  19. entities,
  20. migrations: [],
  21. synchronize: true, // 测试环境总是同步schema
  22. dropSchema: true, // 测试环境每次重新创建schema
  23. logging: false, // 测试环境关闭日志
  24. })
  25. : new DataSource({
  26. type: "postgres",
  27. host: process.env.DB_HOST || "localhost",
  28. port: parseInt(process.env.DB_PORT || "5432"),
  29. username: process.env.DB_USERNAME || "postgres",
  30. password: process.env.DB_PASSWORD || "",
  31. database: process.env.DB_DATABASE || "postgres",
  32. entities,
  33. migrations: [],
  34. synchronize: process.env.DB_SYNCHRONIZE !== "false",
  35. logging: process.env.DB_LOGGING === "true",
  36. });
  37. }
  38. /**
  39. * 默认数据源实例(需要传入实体)
  40. * 注意:这个实例需要在具体模块中传入实体类
  41. */
  42. export let AppDataSource: DataSource;
  43. /**
  44. * 初始化默认数据源
  45. * @param entities 实体类数组
  46. */
  47. export function initializeDataSource(entities: EntityTarget<any>[]): void {
  48. AppDataSource = createDataSource(entities);
  49. }