后端数据库ORM【免费下载链接】typeormTypeScript JavaScript ORM for Node.js — supports PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, and more.项目地址https://gitcode.com/GitHub_Trending/ty/typeorm点击查看免费下载typeorm/codemod是 TypeORM 官方仓库中随 v1.0 发布的自动化代码迁移工具它基于 jscodeshift 的 AST 重写能力把 v0.3.x 到 v1.0 之间的大部分破坏性变更Connection→DataSource、find 选项语法、驱动与依赖升级等自动应用到你的源码和package.json上。阅读本文后你将掌握该工具的全部 CLI 用法、36 个 v1 转换规则的内部实现原理、TODO 人工审查流程以及如何在大型代码库中安全地执行一次可回滚的版本升级。为什么需要自动化迁移v0.3 → v1.0 的破坏性变更TypeORM v1.0 对公共 API 做了大规模重构核心概念从Connection更名为DataSourceconnect()/close()变为initialize()/destroy()Repository.exist()更名为exists()findByIds/findOneById/getCustomRepository等 API 被移除驱动选项与 find 选项语法也有多处调整。手工迁移这些变更不仅枯燥而且极易遗漏。官方在 升级指南 中直接推荐使用typeorm/codemod完成大部分迁移它会原地更新你的代码处理导入重命名、API 替换、find 选项语法、依赖升级等并把无法自动化的变更以TODO注释形式留给你人工处理。快速上手一行命令完成大部分迁移typeorm/codemod的 CLI 约定为typeorm/codemod version [options] paths...。目前仓库只注册了一个版本迁移目标v1描述为 Migrate from v0.3.x to v1.0见 transforms/index.ts因此基本用法是# 运行全部 v1 转换规则原地修改 npx typeorm/codemod v1 src/ # 预演模式只显示将要发生的修改不写入任何文件 npx typeorm/codemod v1 --dry src/ # 只运行某一个转换规则 npx typeorm/codemod v1 --transform connection-to-datasource src/ # 按 glob 模式排除文件可重复指定 npx typeorm/codemod v1 --ignore **/generated* --ignore **/e2e/** src/ # 控制并行 worker 进程数 npx typeorm/codemod v1 --workers 4 src/ # 列出该版本下所有可用的转换规则 npx typeorm/codemod v1 --listCLI 入口位于 index.ts不带参数或带--help/-h时打印用法说明带--version/-v时打印已安装的typeorm/codemod版本号当前仓库为 1.0.3见 package.json其余情况进入参数解析与执行流程。未指定版本、指定未知版本、或未提供任何路径时会报错并退出。运行环境前提Node.js 20 以上package.json 的engines字段与依赖配置中的minNodeVersion: 20.0.0均指向该要求这也是 TypeORM v1 的运行时下限迁移前建议先提交当前代码git commit因为 codemod 是原地改写git diff是你核对每一处变更的依据。CLI 选项全参考README 中给出的选项表对应 parse-args.ts 的实现完整内容如下选项短选项说明--dry-d预演模式显示变更但不写入文件--help-h显示帮助信息--ignore pattern-i追加的排除 glob 模式可重复与默认排除规则合并--list-l列出当前版本可用的转换规则--transform name-t仅运行指定的单个转换规则--version-v打印已安装的typeorm/codemod版本--workers num-wworker 进程数默认值为 CPU 核数减 1参数解析的细节从 parse-args.ts 可以看到几个值得注意的行为位置参数中的第一个非选项参数被解释为version其余作为待处理路径paths--workers必须是正整数否则直接报错退出--ignore支持多次出现内部累积成数组--transform等带值选项如果缺值下一个参数以-开头或不存在会输出Error: flag requires a value并退出。永远排除.d.ts文件**/*.d.ts是硬编码的默认排除项DEFAULT_IGNORE_PATTERNS见 run-transforms.ts。原因是.d.ts环境类型声明描述的是使用者依赖的类型形状改写其中的标识符会静默破坏已发布的类型。用户提供的--ignore模式通过buildIgnorePatterns叠加在默认规则之后两者同时生效。transform 体系36 个 v1 转换规则typeorm/codemod的转换规则以 版本 分组。当前唯一的v1分组定义在 transforms/v1/index.ts其中导出了一个有序的 36 个 transform 数组。顺序为什么重要该文件的注释明确说明了排序的约束connection-to-datasource必须最先运行这样后续 transform 看到的是DataSource而不是ConnectiondatasourceName必须在globalFunctions之前运行这样在createConnection导入被剥离之前还能先改写createConnection({ name })的参数。这说明迁移规则之间存在依赖关系不能随意调整顺序。36 个规则一览按源码顺序它们覆盖了 v1 破坏性变更的方方面面连接与数据源connection-to-datasourceConnection→DataSource、datasource-namecreateConnection({ name })参数改写、connection-manager、connection-options-reader全局函数与容器global-functionscreateConnection/getConnection等全局函数、use-containerIoCuseContainer移除Repository APIrepository-find-by-ids、repository-find-one-by-id移除的findByIds/findOneById、repository-existexist()→exists()、repository-abstractQueryBuilderquery-builder-print-sql、query-builder-native-parameters、query-builder-where-expression、query-builder-on-conflict、query-builder-or-update、query-builder-replace-property-namesfind 选项find-options-join、find-options-lock-modes、find-options-string-select、find-options-string-relations列选项column-readonly、column-width-zerofill、column-unsigned-numeric驱动与数据源选项datasource-mysql-connector、datasource-sqlite-options、datasource-sqlite-type、datasource-mongodb、datasource-mssql、datasource-sap、datasource-expoMongoDBmongodb-stats、mongodb-types其他migrations-get-all、query-runner-loaded-tables-views、relation-count、file-logger。运行npx typeorm/codemod v1 --list会输出全部规则名称与描述其中标记为(*)的规则在运行后需要人工复核实现见 list-transforms.ts。以 connection-to-datasource 为例AST 重写的典型思路connection-to-datasource.ts 是规模最大也最典型的规则其处理层次可以概括为文件级作用域闸门文件里没有任何typeorm或typeorm/...导入/再导出时直接跳过避免误伤其他库中同名标识符如 mongoose 的Connection类型重命名Connection→DataSource、ConnectionOptions→DataSourceOptions、BaseConnectionOptions→BaseDataSourceOptions同时改写导入说明符、类型引用TSTypeReference、类型查询TSTypeQuery与new表达式并处理Connection as Foo这类别名导入和 CJSrequire(typeorm)解构驱动特定选项类型MysqlConnectionOptions这类深层类型会被重写为ExtractDataSourceOptions, { type: mysql | mariadb }内联表达式MySQL 选项同时覆盖mariadb所以生成联合字面量避免用户依赖typeorm/driver/...深层导入路径方法重命名只在接收者被识别为 DataSource 实例时把.connect()→.initialize()、.close()→.destroy()。接收者识别来自带类型标注的变量、函数参数、类属性、构造器参数属性private readonly x: DataSource、getter 返回类型以及访问链推断如dataSource.manager推导为EntityManager、dataSource.getRepository()推导为Repository属性重命名.connection→.dataSource覆盖QueryRunner、EntityManager、各类Repository、各类QueryBuilder、EntityMetadata以及BaseEvent/InsertEvent等订阅者事件类型ColumnMetadata、IndexMetadata则特殊处理为.entityMetadata.dataSourcev1 中它们的.connectiongetter 被整体移除再导出与去重export * from typeorm/...的深层路径同步改写并对重命名后产生的重复 import 去重。测试夹具可以直观印证这些行为例如 connection-to-datasource-class-members.input.ts 展示了this.tenantConnection.connect()→this.tenantConnection.initialize()、getter 返回类型参与接收者识别同时保证未标注类型、与 TypeORM 无关的类属性不被误改。转换的两种结果改写源码 或 留下 TODO每个 transform 要么直接改写源码要么在无法自动化处插入 TODO 注释。例如 query-builder-print-sql 的输出夹具 中.printSql()调用原样保留但在其上插入了// TODO(typeorm-v1): printSql() was removed — use getSql() or getQueryAndParameters() to inspect SQLTODO 前缀统一为TODO(typeorm-v1):由 todo.ts 集中定义。该模块还保证了幂等性再次运行时如果同一节点已有相同 TODO 注释不会重复插入同时会把注释插在// prettier-ignore指令之前避免破坏该指令。运行机制基于 jscodeshift 的流水线与统计执行入口在 run.ts一次运行的完整链路为resolveTransforms解析出要运行的 transform 文件路径resolve.ts指定--transform时只解析单个文件否则解析整个 version 的index文件runTransforms逐规则调用 jscodeshift Runner 处理所有路径runDependencies扫描并升级package.jsonprintSummary输出统计汇总printGuide提示格式化建议任一环节出现错误transform 解析错误或依赖升级错误都会把process.exitCode置为 1便于 CI 感知失败。runTransformsAST 转换的执行细节run-transforms.ts 直接调用jscodeshift/src/Runner关键配置包括文件扩展名ts,tsx,js,jsx解析器tsx可同时处理 TS 与 TSX 语法ignorePattern为默认规则与用户--ignore的合并结果cpus仅在用户显式传入--workers时设置否则交给 jscodeshift 默认README 所述默认值为 CPU 核数减 1通过拦截process.stdout.write解析 jscodeshift 输出的Processing N files、ERR、OKK、NOC、SKIP行驱动进度 spinner含剩余时间 ETA 估算并把无法分类的 worker 输出缓冲起来、在运行结束后打印避免警告与堆栈被吞掉每个 transform 结束后输出一行摘要如✔ Changed 12 out of 40 files (3.2s)。transformer 管道规则如何在单文件内串联单个 transform 文件本质上是导出{ name, description, fn }的模块。transformer.ts中的transformer(transforms)工厂把这些规则串成一条管道按顺序对同一个文件的源码依次应用每个规则的fn任一规则返回了字符串就累计hasChanges最后只把有变更的文件写回。同时通过api.stats记录每个规则实际命中了多少个文件applied:name供汇总输出展示。输出汇总的内容print-summary.ts 最终打印Statistics处理文件总数、被转换文件数、跳过文件数、解析错误数、耗时Transforms applied按命中文件数降序排列的规则命中统计Parse errors解析失败的文件与错误信息按文件排序Files requiring manual review所有被插入 TODO 注释的文件按规则分组Dependency changespackage.json的变更、警告与错误重复项按(N times)聚合。运行后需要人工处理的 TODOREADME 明确提示部分 transform 会在代码中留下TODO注释标记需要人工修改的位置codemod 完成后会列出所有需要人工审查的文件对应printTodos的 Files requiring manual review 分组列表。这些 TODO 是迁移流程的安全阀——凡涉及业务逻辑判断、无法通过类型/上下文推断的变更工具都不会替你拍板而是明确标注出来。处理建议先用git diff通读 codemod 的全部改动逐个搜索TODO(typeorm-v1):按注释给出的替代 API 手工修改重新运行类型检查与测试。依赖升级package.json 的自动处理除了改写源码typeorm/codemod还会自动扫描项目中的package.json并做依赖升级。查找逻辑见 find-package-json.ts递归搜索给定路径下的所有package.json排除node_modules搜索根为当前工作目录与用户传入路径的并集。三类依赖处理策略依赖规则配置在 dependencies/v1.ts按四类处理包替换replacements——旧包被新包取代旧包新包目标版本mysqlmysql2^3.22.0sqlite3better-sqlite3^12.9.0版本升级upgrades——版本低于最低要求时自动提升到目标版本实现在 upgrade.ts 中通过semver.minVersion比较非标准版本号如file:/link:/git 依赖会报错要求手动处理包名最低版本升级目标typeorm^1.0.0^1.0.0nestjs/typeorm^11.0.1^11.0.1mongodb^7.0.0^7.1.1mssql^12.0.0^12.3.0mysql2^3.15.3^3.22.0ioredis^5.0.4^5.10.1redis^5.0.0^5.12.1expo^52.0.0^55.0.0google-cloud/spanner^8.0.0^8.6.0better-sqlite3^12.0.0^12.9.0typeorm-aurora-data-api-driver^3.0.0^3.0.2不兼容包incompatible——检测到即报错Errors并附上迁移建议包括typeorm-seeding使用被移除的ConnectionAPI、pg-mem使用被移除的getConnectionManager()、typeorm-naming-strategies依赖内部路径并覆盖已移除接口方法、typeorm-typedi-extensions与typeorm-routing-controllers-extensionsIoCuseContainer移除、mock-typeorm与opentelemetry/instrumentation-typeorm等。警告warnings——检测到即提示不阻断如dotenvv1 不再自动加载.env需在DataSource中显式配置、typeorm-transactional仍使用已弃用的.connection属性、以及 peer dependency 尚未支持 v1 的nestjs-typeorm-paginate、typeorm-encrypted、typeorm-fixtures-cli等。Node 版本检查若engines.node低于20.0.0会产生警告提示更新。写回package.json时会保留原有的缩进风格2 空格或 4 空格自动探测且在--dry模式下不做任何写入。运行后的收尾格式化与 git diff 审查格式化codemod 基于 AST 重写可能引入细微的格式差异多余括号、引号风格变化等。README 与printGuide都建议迁移后运行项目自身的格式化器恢复代码风格npx typeorm/codemod v1 src/ npx prettier --write src/ # 或npx eslint --fix src/Scoping 限制没有类型信号的代码可能不会被转换README 的 Scoping 一节对转换边界做了诚实说明重命名属性或方法的 transform如.connection→.dataSource依赖类型标注来识别 TypeORM 实例同时它们也能识别初始器是已知访问链的未标注类字段如private manager this.dataSource.manager见resolveAccessorChainType对dataSource.manager/getRepository()/createQueryRunner()等访问链的推导。但完全没有类型信号的代码可能无法被自动转换——例如纯 JS 中未标注类型且初始器无法追溯的变量。因此运行结束后务必逐行检查git diff对遗漏处手工修补。验证与测试仓库为每个 transform 都配备了输入/输出夹具测试位于 test/transforms/v1/fixtures 下可直接作为迁移效果的预期行为说明书。几个值得阅读的示例connection-to-datasource-class-members.input.ts类属性、getter 返回类型、构造器参数属性的接收者识别以及对无关类的保护connection-to-datasource-chained-access.output.ts链式访问this.entityManager.connection→this.entityManager.dataSource以及事件解构const { queryRunner } event后的属性改写repository-exist-typed.input.tsuserRepo.exist()→userRepo.exists()同时保证文件系统中同名.exist()方法、Redis 风格缓存客户端的.exist()不被误改query-builder-print-sql.output.tsTODO 注释的插入位置与措辞。这些夹具也提醒我们codemod 的核心设计原则是只在有充分把握时改写拿不准就留 TODO这正是它适合大规模代码库的原因。延伸阅读升级指南Upgrading from 0.3 to 1.0v1 全部破坏性变更的权威说明是人工处理 TODO 时的主要参考v1 release notesv1.0 的发布说明与路线图run-transforms.tsjscodeshift Runner 调用与进度/错误捕获的实现dependencies/v1.ts依赖替换、升级、不兼容检测的完整规则表。赞分享后端数据库ORM【免费下载链接】typeormTypeScript JavaScript ORM for Node.js — supports PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, and more.项目地址https://gitcode.com/GitHub_Trending/ty/typeorm点击查看免费下载相关推荐散落各处的教案别再孤军奋战用GraphRAG知识图谱RAG把教育数据串成一张网散落各处的教案别再孤军奋战用GraphRAG知识图谱RAG把教育数据串成一张网 教师、教研团队和教育产品团队把分散在各系统的教案、课件、学生档案交给Grap人工智能RAG知识图谱数据工程大模型TypeORM 1.0 升级指南从 0.3.x 迁移的完整 Breaking Changes 清单与实战方案TypeORM 1.0 升级指南从 0.3.x 迁移的完整 Breaking Changes 清单与实战方案 本文是一份面向 TypeORM 0.3.x 存量后端数据库ORMTypeORM迁移生成失败终极指南从报错到修复的完整解决方案TypeORM迁移生成失败终极指南从报错到修复的完整解决方案 TypeORM迁移是数据库版本控制的核心功能但在实际使用中迁移生成失败是开发者经常遇到的痛点后端数据库ORM上一篇800 免费API接口速查指南无需认证的API与选型清单下一篇个人博客评论系统集成gh_mirrors/v41/v4中Disqus与Commento对比创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考