TypeORM DataSourceOptions 全解:从零配置到源码级消费链路
TypeORM DataSourceOptions 全解从零配置到源码级消费链路【免费下载链接】typeormTypeScript JavaScript ORM for Node.js — supports PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, and more.项目地址: https://gitcode.com/GitHub_Trending/ty/typeorm在 TypeORM 中一切数据访问都始于一个DataSource实例而驱动这个实例行为的正是创建时传入的DataSourceOptions配置对象。本文基于 TypeORM 官方文档 数据源配置项逐项讲解所有通用配置选项的语义、取值与默认值并结合 BaseDataSourceOptions 等源码印证每个选项的真实作用点读完你可以独立完成 MySQL / PostgreSQL 等数据库的数据源配置并理解这些选项在initialize()流程中是如何被消费的。一、什么是 DataSourceOptionsDataSourceOptions是你创建新的DataSource实例时传入的数据源配置。不同 RDBMS 有自己的专属配置项因此DataSourceOptions在源码中是一个联合类型src/data-source/DataSourceOptions.ts 将它定义为各驱动配置类型的联合例如AuroraMysqlDataSourceOptions | PostgresDataSourceOptions | MysqlDataSourceOptions | ...覆盖全部 19 个驱动目录aurora-mysql、postgres、mysql、mssql、mongodb、sqljs等。每个驱动的选项接口都继承自公共基座 BaseDataSourceOptions其中声明了所有数据库共享的配置项entities、logging、synchronize、cache等各驱动再叠加自己的连接凭据与专有选项。二、通用数据源选项详解1. type数据库引擎类型必填type指定你使用的数据库引擎是必填项。源码 DatabaseType 给出的完整取值为aurora-mysql | aurora-postgres | better-sqlite3 | capacitor | cockroachdb | cordova | expo | mariadb | mongodb | mssql | mysql | nativescript | oracle | postgres | react-native | sap | spanner | sqljs驱动工厂根据该字段选择对应的 Driver 实现见 DriverFactory。2. 连接信息与 extra各驱动的host/port/username/password/database等连接凭据由各自接口定义例如 MysqlDataSourceOptions 在基础凭据之外还暴露了charset、timezone、connectTimeout、acquireTimeout、replication主从读写分离等 MySQL 专属选项PostgresDataSourceOptions 则提供schema、useUTC、uuidExtension、extensions、replication等 PostgreSQL 专属选项更多细节可参考 PostgreSQL 驱动文档 与 MySQL 驱动文档。extra选项用于把额外设置透传给底层驱动客户端如pg、mysql2、tedious、mongodb。从 BaseDataSourceOptions 的注释可以看出其定位当驱动原生支持的设置没有被 TypeORM 建模为带类型的选项时extra是“逃生舱”如果存在带类型的对应选项应优先使用带类型的选项。3. entities / subscribers / migrations元数据加载entities— 要加载的实体列表接受实体类、Entity Schema 类以及目录路径目录支持 glob 通配符例如entities: [Post, Category, entities/*.js, modules/**/entities/*.js]。 从 BaseDataSourceOptions 的源码类型MixedListFunction | string | EntitySchema可以确认实体类、目录路径与 EntitySchema 对象可混合传入。文档示例中的独立entitySchemas字段是旧版写法当前实现统一经由entities传入。实体定义详见 Entities 与 Entity Schemas。subscribers— 要加载的订阅者同样接受类与 glob 目录例如subscribers: [PostSubscriber, AppSubscriber, subscribers/*.js, modules/**/subscribers/*.js]。详见 Subscribers。migrations— 要加载的迁移文件类或 glob 路径。详见 Migrations。4. logging / logger / maxQueryExecutionTime日志三件套logging— 是否启用日志。源码中其类型为 LoggerOptions即boolean | all | LogLevel[]设为true时启用查询与错误日志也可以指定具体类型数组例如[query, error, schema]。logger— 指定日志输出实现取值为advanced-console、simple-console、formatted-console、file默认advanced-console从 BaseDataSourceOptions 的源码类型看还额外支持debug值。也可以传入任意实现了Logger接口的自定义类Logging详见 Logging。maxQueryExecutionTime— 查询执行时间超过该毫秒阈值时logger 会记录一条慢查询日志。注意 MySQL 驱动有个联动行为在 MysqlDataSourceOptions 中若同时设置enableQueryTimeout: true该值还会被用作底层查询的真实超时。5. poolSize连接池大小poolSize配置连接池中最大的活跃连接数。从源码看各驱动会将其映射到底层驱动的不同池参数驱动映射位置底层参数PostgreSQLPostgresDrivermax: options.poolSizeMySQL / MariaDBMysqlDriverconnectionLimit: credentials.poolSize ?? options.poolSizeMongoDBMongoDrivermaxPoolSizeOracleOracleDriverpoolMaxCockroachDBCockroachDrivermax需要注意better-sqlite3、react-native、capacitor、sqljs、spanner、mssql等单连接型驱动在自己的选项接口中把poolSize重新声明为never例如 BetterSqlite3DataSourceOptions意味着这些驱动不支持该选项配置后会在类型层面被拦截。6. namingStrategy / entityPrefix / entitySkipConstructornamingStrategy— 用于命名字符串表中表和列的命名策略实现 NamingStrategyInterface 接口的实例缺省使用 DefaultNamingStrategy。entityPrefix— 给该数据源中所有表或集合加上统一前缀。entitySkipConstructor— 从数据库反序列化实体时是否跳过构造函数。注意跳过构造函数后私有属性和默认属性值不会按预期工作见 BaseDataSourceOptions 的注释。7. synchronize / dropSchema两个“危险开关”这两个选项都会自动改动数据库结构源码中二者都在initialize()里被消费synchronize— 每次应用启动时自动创建/同步数据库 schema。文档明确警告不要在生产环境使用否则可能丢失生产数据它更适合调试和开发阶段。替代方案是 CLI 的schema:sync命令。对 MongoDB 而言由于 MongoDB 无 schema该选项不创建表仅通过创建索引来“同步”。dropSchema— 每次数据源初始化时先丢弃整个 schema。同样只应出现在开发/调试环境否则将清空全部生产数据。从 DataSource.initialize() 的调用链可以看到执行顺序// 连接驱动后按顺序执行 await this.buildMetadatas() // 1. 构建实体元数据 await this.driver.afterConnect() if (this.options.dropSchema) // 2. 先丢弃 schema await this.dropDatabase() if (this.options.migrationsRun) // 3. 自动执行迁移 await this.runMigrations({ transaction: this.options.migrationsTransactionMode }) if (this.options.synchronize) // 4. 最后同步 schema await this.synchronize()即dropSchema→migrationsRun→synchronize的先后顺序是固定的且任何一步失败都会destroy()当前数据源并抛出异常。8. 迁移相关migrationsRun / migrationsTransactionMode / migrationsTableNamemigrationsRun— 每次应用启动时自动执行迁移替代方案是 CLI 的migrations:run命令。migrationsTransactionMode— 控制迁移运行时的事务模式取值为all所有迁移在一个事务中/none不在事务中/each每条迁移各自一个事务见 BaseDataSourceOptions。migrationsTableName— 存放已执行迁移信息的表名默认为migrations。9. metadataTableName存放表元数据信息的表名默认为typeorm_metadata见 BaseDataSourceOptions 的注释。10. cache实体结果缓存cache可设为布尔值直接开启或传入对象细粒度配置。从源码 BaseDataSourceOptions 看完整字段包括字段说明默认值type缓存类型database存入数据库独立表/redis/ioredis/ioredis/clusterdatabaseprovider自定义缓存提供者的工厂函数返回实现QueryResultCache的对象-tableNamedatabase类型下的缓存表名query-result-cacheoptionsRedis 等外部缓存的连接配置-alwaysEnabled设为true时find 方法与 QueryBuilder 查询永远走缓存-duration缓存过期时间毫秒可按查询覆盖10001 秒ignoreErrors缓存出错时是否忽略错误并直接回落到数据库-缓存机制详见 Caching。cache配置生效的时点同样在initialize()中若配置了缓存会先执行queryResultCache.connect()再构建元数据见 DataSource。11. isolateWhereStatementswhere 子句括号隔离设为true时自动为每个 where 子句包裹括号防止多个条件拼接时产生运算符优先级问题。例如// 配置前 .where(user.firstName :search OR user.lastName :search) // 生成WHERE user.firstName ? OR user.lastName ? // 配置后 // 生成WHERE (user.firstName ? OR user.lastName ?)12. invalidWhereValuesBehaviornull / undefined 值处理控制高层操作find 操作、repository 方法、EntityManager 方法中 where 条件遇到null/undefined时的行为不直接影响QueryBuilder 的.where()。源码 InvalidFindOptionsWhereBehavior 定义的取值null行为ignore— 跳过为 null 的属性sql-null— 把 null 转换为 SQLNULLthrow— 抛出错误默认undefined行为ignore— 跳过为 undefined 的属性throw— 抛出错误默认示例invalidWhereValuesBehavior: { null: sql-null, undefined: ignore }。相关处理规则详见 Null and Undefined Handling。13. 源码中存在、值得了解的其他通用选项从 BaseDataSourceOptions 的完整接口结构看还有若干未在上文列出的通用选项可供使用isolationLevel— 事务默认隔离级别未显式指定级别的transaction()/startTransaction()都将使用它且必须在驱动支持的级别范围内initialize()会先行校验见 validate-isolation-level。relationLoadStrategy— 关系加载策略join默认用嵌套 JOIN或query分开查询嵌套 join 数据量大时建议改用后者也可在单次 FindOptions / QueryBuilder 中覆盖。typename— 为每个水合后的模型实体附加一个属性值为实体名作用类似 discriminator 字段。三、完整配置示例文档给出的 MySQL 数据源配置示例如下{ host: localhost, port: 3306, username: test, password: test, database: test, logging: true, synchronize: true, entities: [__dirname /entities/**/*{.js,.ts}], subscribers: [__dirname /subscribers/**/*{.js,.ts}], entitySchemas: [__dirname /schemas/**/*.json], migrations: [__dirname /migrations/**/*{.js,.ts}] }结合源码再补充一个启用缓存、日志分级与 where 值行为控制的 PostgreSQL 示例展示各选项如何组合import { DataSource } from typeorm const dataSource new DataSource({ type: postgres, host: localhost, port: 5432, username: test, password: test, database: test, schema: public, // 元数据加载实体类 glob 目录混排 entities: [Post, Category, entities/**/*.ts], subscribers: subscribers/**/*.ts, migrations: migrations/**/*.ts, migrationsTableName: migrations_history, migrationsTransactionMode: each, // 日志与性能 logging: [query, error, schema], logger: advanced-console, maxQueryExecutionTime: 1000, poolSize: 10, // 开发期开关生产环境务必关闭 synchronize: false, dropSchema: false, // 结果缓存 cache: { type: database, tableName: query-result-cache, duration: 60000, }, // where 条件行为 isolateWhereStatements: true, invalidWhereValuesBehavior: { null: sql-null, undefined: ignore }, extra: { application_name: my-service, // 透传给 pg 驱动 }, }) await dataSource.initialize()四、小结配置项与消费时点的对应关系DataSourceOptions的设计遵循一个清晰的分层公共选项集中在 BaseDataSourceOptions类型、元数据加载、日志、同步、缓存、where 行为驱动专属选项分散在各驱动的*DataSourceOptions接口中由 DataSourceOptions 联合起来提供类型约束。而dropSchema、migrationsRun、synchronize这类“改变数据库结构”的选项其实际执行点统一收敛在 DataSource.initialize() 的一条有序链路中这为理解 TypeORM 的启动行为提供了确定的依据。掌握这些配置项的语义与生效位置后你可以针对开发环境开synchronize快速迭代与生产环境关闭危险开关、显式poolSize、合理cache策略分别组装出既安全又可维护的数据源配置。【免费下载链接】typeormTypeScript JavaScript ORM for Node.js — supports PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, and more.项目地址: https://gitcode.com/GitHub_Trending/ty/typeorm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考