概述 该项目为TypeORM与InterSystems IRIS 的typeorm-iris集成提供了实验性支持,使开发人员能够使用 TypeORM 著名的装饰器和存储库抽象与 IRIS 进行交互。这为使用 IRIS 作为后端数据库构建 Node.js 应用程序的 JavaScript 和 TypeScript 开发人员提供了更熟悉的开发体验。
TypeORM MongoDB 评论。我最近开始在…中使用 TypeORM | 作者:Eliezer Steinbock | Medium
虽然该项目实现了与 TypeORM 的关键集成点并支持基本的实体操作,但它尚未经过实战检验或不适用于生产环境。
为什么typeorm-iris? 官方的 InterSystems IRIS Node.js 驱动程序不像其他数据库驱动程序(例如 PostgreSQL 或 MySQL)那样提供原生 SQL 查询执行功能。您必须使用基于 ObjectScript 的 API(例如%SQL.Statement)来准备和执行 SQL 命令。
在构建依赖于 TypeORM 等对象关系映射 (ORM) 工具的现代应用程序时,这会成为一个问题。TypeORM 需要一个能够在单个连接会话中准备和执行原始 SQL 的底层驱动程序,而 IRIS 的 JavaScript 工具目前尚不支持此功能。
为了克服这些限制,typeorm-iris使用底层可用的 ObjectScript SQL 执行接口实现了桥接 IRIS 和 TypeORM 所需的部分。
早期阶段和已知问题 该项目尚处于初始阶段,仅经过有限数量的测试。预计未来迭代中可能会出现不稳定、功能缺失和重大变更的情况。
开发过程中观察到的显著限制包括:
1.过多的网络往返 通过 JavaScript 中的类执行 SQL%SQL.Statement涉及 Node.js 进程和 IRIS 服务器之间的多条网络消息。例如,单个逻辑 SQL 操作可能需要多个步骤,例如:
准备声明 执行查询 获取元数据 单独获取行 这些中的每一个都会导致网络上的单独消息,与使用本机 SQL 驱动程序相比,会导致更多的开销。
- 没有真正的异步/并行支持 官方 IRIS Node.js 驱动程序不支持在多线程或基于工作者的上下文中异步使用:
在同一进程中重新连接经常会失败或导致不可预测的行为。 生成工作线程并使用其中的驱动程序会导致问题。 每个进程只有一个连接可靠地工作。 这些限制使其不适合现代并发 Node.js 应用程序。实际上,这限制了驱动程序在并发工作负载下的扩展能力,并严重限制了架构选择。
使用指南 由于使用最新的 IRIS SQL 功能,需要 IRIS 2025.1+ 才能运行。
您可以typeorm-iris通过 npm 安装:
npm install typeorm-iris 由于此驱动程序未得到 TypeORM 的官方支持,因此使用它需要采取一些变通方法来设置。您不能像使用官方驱动程序那样DataSource直接使用new DataSource()或。createConnection()
自定义数据源设置 import { IRISDataSource, IRISConnectionOptions } from "typeorm-iris"
const dataSourceOptions: IRISConnectionOptions = { name: "iris", type: "iris", host: "localhost", port: 1972, username: "_SYSTEM", password: "SYS", namespace: "USER", logging: true, dropSchema: true, }
export function createDataSource(options: any): IRISDataSource { // @ts-ignore const dataSource = new IRISDataSource({ ...dataSourceOptions, ...options }) return dataSource } 一旦初始化,您就可以照常使用 TypeORM 装饰器:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
@Entity() export class User { @PrimaryGeneratedColumn() id: number
@Column()
name: string
@Column()
email: string
} 使用存储库的工作原理类似:
const userRepository = dataSource.getRepository(User) const newUser = userRepository.create({ name: "Alice", email: "alice@" }) await userRepository.save(newUser) 示例项目 GitHub 存储库包含一个sample/文件夹,其中包含几个完整工作的示例:
sample1-simple-entity sample2-one-to-one sample3-many-to-one sample4-many-to-many sample16-indexes 这些涵盖了基本的持久性、关系和模式特征,提供了实际的使用演示。
单元测试 初步测试包括以下用例:
实体模型 应该可以成功保存并成功使用静态方法 应该成功重新加载给定实体 应该重新加载完全相同的实体 应该可以成功更新 实体模式 > 索引 基本的 持久性 基本功能 实体更新 插入 > 插入后更新关系列 多对多 一对一 这些测试的范围有限,随着项目的成熟将增加更多的覆盖范围。
支持的功能 实体装饰器:@Entity(),,@Column()@PrimaryGeneratedColumn() 存储库:create、、、、等save。finddelete 模式删除和同步(实验性) 部分支持关系和自定义查询 再次强调,这些功能还处于早期阶段,可能无法涵盖 TypeORM 的全部功能。
现实世界的约束 InterSystems IRIS Node.js 驱动程序限制 每个进程只有一个可用连接 没有对并行操作或线程的适当支持 缺乏原生 SQL API 支持(通过 SQL 协议) 严重依赖使用专有协议的基于消息的通信 在 InterSystems 更新官方驱动程序以支持正确的 SQL 执行和并发操作之前,该项目在性能和可扩展性方面将受到根本限制。
反馈与贡献 由于这是一个实验性的驱动程序,您的反馈至关重要。无论您是想将其用于小型辅助项目,还是评估其更广泛的用途,请在 GitHub 上分享问题和建议:
欢迎提出请求、测试用例和改进文档。
下一步 计划的未来改进包括:
扩大实际查询和模式设计的测试覆盖范围 处理更多 TypeORM 查询构建器功能 调查批处理优化 改进迁移的架构自省 结论 typeorm-iris为 InterSystems IRIS 带来了 Node.js 开发者急需的 TypeORM 支持。虽然目前它尚未投入生产,并且继承了现有驱动程序基础架构的严重限制,但它为进一步的实验以及 IRIS 开发者社区更广泛的采用奠定了基础。查看更多www.mxwd.cc