Node.jsによるintersystemsのためのTypeORM、typeorm-irisの紹介
概要
typeorm-irisプロジェクトは、TypeORMのInterSystems IRISとの統合に対して実験的サポートを提供し、開発者がTypeORMのよく知られているデコレーターとリポジトリの抽象化を使用してIRISとやり取りできるようにします。 これにより、IRISをバックエンドデータベースとして使用するNode.jsアプリケーションを構築するJavaScriptやTypeScript開発者にとって、より馴染みのある開発体験が可能になります。

プロジェクトはTypeORMとの主要な統合ポイントを実装しており、基本的なエンティティ操作をサポートしていますが、まだ十分に実戦で検証されておらず、本番環境には適していません。
なぜtypeorm-irisなのか?
公式のIntersystems IRIS Node.jsドライバーは、他のデータベースドライバー(例えば、PostgreSQLまたはMySQL向け)と同じようなネイティブSQLクエリの実行を提供していません。 代わりに、ObjectScriptベースのAPI(例えば、%SQL.Statement)を使用して、SQLコマンドを準備して実行する必要があります。
これは、TypeORMのようなオブジェクト関係マッピング(ORM)に依存している最新のアプリケーションを構築する場合に問題になります。 TypeORMには、単一の接続セッションで生のSQLを準備して実行できる下位レベルのドライバーが必要ですが、IRISのJavaScriptツールでは現在利用できません。
これらの制限を克服するために、typeorm-irisはIRISとTypeORMを連携させるために必要なコンポーネントを実装し、内部では利用可能なObjectScriptのSQL実行インターフェースを使用しています。
初期段階と既知の課題
このプロジェクトは初期段階にあり、限られた数のケースでのみテストされています。 今後のバージョンでは、不安定な動作、機能の欠如、互換性を壊す変更がある可能性があります。
開発中に確認された主な制限事項には以下が含まれます。
1. 過剰なネットワーク往復
JavaScriptの%SQL.StatementクラスからのSQLの実行には、Node.jsプロセスとIRISサーバー間で複数のネットワークメッセージのやり取りが発生します。 例えば、1つの論理的なSQL操作でも、次のような複数のステップを必要とする場合があります。
- ステートメントを準備中
- クエリを実行中
- メタデータを取得中
- 個々の行を取得中
これらの各ステップは、ネットワーク越しにそれぞれ個別のメッセージとして送信される可能性があり、ネイティブのSQLドライバーを使用する場合と比べて、オーバーヘッドが大幅に増加します。
2. 非同期・並列処理に未対応
公式のIRIS Node.jsドライバーは、マルチスレッドやワーカーを利用したコンテキストにおける非同期処理をサポートしていません。
- 同一プロセス内で再接続を行うと、失敗や予測不可能な動作を引き起こすことがあります。
- ワーカースレッドを生成し、その中でドライバーを使用すると問題が発生します。
- プロセスにつき1つの接続のみが確実に動作します。
これらの制約のため、最新の並行処理を行うNode.jsアプリケーションには適していません。 実際には、これによりドライバーの並行処理におけるスケーラビリティが制限され、アーキテクチャの選択肢も大幅に狭まります。
使用ガイド
最新のIRIS SQL機能を使用しているため、IRIS 2025.1以降が必要です。
npmでtypeorm-irisをインストールできます。
npm install typeorm-irisこのドライバーはTypeORMによって公式にサポートされていないため、DataSourceの設定には回避策が必要です。 公式ドライバーのように、new DataSource()やcreateConnection()を直接使用することはできません。
DataSourceのカスタム設定
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@example.com" })
await userRepository.save(newUser)サンプルのプロジェクト
Githubリポジトリには、完全に動作する例が入ったsample/フォルダが含まれています。
sample1-simple-entitysample2-one-to-onesample3-many-to-onesample4-many-to-manysample16-indexes
これらは、基本的な永続化、リレーション、およびスキーマ機能を扱っており、実践的な使用方法を示しています。
ユニットテスト
初期テストには、以下のユースケースが含まれています。
エンティティモデル
- 正常に保存され、staticメソッドも問題なく使用できる
- 指定したエンティティを正常に再読み込みできる
- まったく同じエンティティを再読み込みできる
- 正常にupsert(アップサート)できる
エンティティスキーマ > インデックス
- 基本
Persistence
- 基本的な機能
- エンティティの更新
- 挿入 > update-relation-columns-after-insertion
- 多対多
- 一対一
これらのテストは範囲が限られていますが、プロジェクトが進むにつれてテスト範囲も広がっていきます。
サポートされている機能
- エンティティデコレーター
@Entity()、@Column()、@PrimaryGeneratedColumn() - リポジトリ:
create、save、find、deleteなど - スキーマの削除と同期(実験的)
- リレーションとカスタムクエリの部分的なサポート
これらの機能はまだ初期段階のため、TypeORMのすべての機能を網羅しているわけではありません。
現実世界の制約
intersystems IRIS Node.jsドライバーの制限
- プロセスにつき使用可能な接続は1つのみ
- 並列処理やスレッドに対する適切なサポートがない
- ネイティブのSQL APIサポートがない(SQLプロトコル経由)
- 専用プロトコルを使用したメッセージベースの通信に強く依存している
InterSystemsが公式ドライバーに適切なSQL実行および並行処理のサポートを追加するまでは、このプロジェクトはパフォーマンスおよびスケーラビリティの面で根本的な制限を受けます。
フィードバックと貢献
これは実験的なドライバーであるため、あなたのフィードバックは重要です。 小さいサイドプロジェクトを試している場合でも、より広範な利用を検討してる場合でも、GitHubで課題やご意見をぜひお寄せください。
➡️ github.com/caretdev/typeorm-iris/issues
プルリクエスト、テストケース、ドキュメントの改善も大歓迎です。
次の内容
今後の改善予定:
- 実際のクエリやスキーマ設計に対するテストカバレッジの拡大
- さらに多くのTypeORMクエリビルダー機能に対応
- バッチ処理の最適化に関する調査
- 移行でのスキーマイントロスペクションの改善
まとめ
typeorm-irisは、Node.js開発者向けにInterSystems IRISのための待望のTypeORMサポートを提供します。 現時点では本番環境向けではなく、現在のドライバーインフラストラクチャから深刻な制約を引き継いでいますが、さらなる実験や将来的なIRIS開発者コミュニティでの広範な採用の基盤を提供します。
TypeORMを使って最新のNode.jsバックエンドと統合する方法を探しているIRIS開発者にとって、これは出発点です。
もしこれが役に立ったと思ったら、ぜひ InterSystems Developer Tools Contestで投票してください!