data-source.ts 2.4 KB

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