記事
· 2025年12月22日 7m read

Node.jsによるintersystemsのためのTypeORM、typeorm-irisの紹介

概要

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

TypeORM MongoDB Review. I recently started using TypeORM in a… | by 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は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-entity
  • sample2-one-to-one
  • sample3-many-to-one
  • sample4-many-to-many
  • sample16-indexes

これらは、基本的な永続化、リレーション、およびスキーマ機能を扱っており、実践的な使用方法を示しています。

ユニットテスト

初期テストには、以下のユースケースが含まれています。

エンティティモデル

  • 正常に保存され、staticメソッドも問題なく使用できる
  • 指定したエンティティを正常に再読み込みできる
  • まったく同じエンティティを再読み込みできる
  • 正常にupsert(アップサート)できる

エンティティスキーマ > インデックス

  • 基本

Persistence

  • 基本的な機能
  • エンティティの更新
  • 挿入 > update-relation-columns-after-insertion
  • 多対多
  • 一対一

これらのテストは範囲が限られていますが、プロジェクトが進むにつれてテスト範囲も広がっていきます。

サポートされている機能

  • エンティティデコレーター@Entity()@Column()@PrimaryGeneratedColumn()
  • リポジトリ:createsavefinddeleteなど
  • スキーマの削除と同期(実験的)
  • リレーションとカスタムクエリの部分的なサポート

これらの機能はまだ初期段階のため、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で投票してください

ディスカッション (0)0
続けるにはログインするか新規登録を行ってください