コンテンツにスキップ
Sutando
Esc
↑↓移動↵開く⌘Jプレビュー

Sutando vs TypeORM:モダンな Active Record の代替

TypeORM は長年 Node.js で最も人気のある ORM の一つでしたが、デコレーター依存やメンテナンス問題により、多くの開発者が代替を探しています。Sutando はその代替となります。

TypeORM は長年 Node.js で最も人気のある ORM の一つでしたが、デコレーター依存やメンテナンス問題により、多くの開発者が代替を探しています。Sutando はその代替となります。

TypeORM の問題点

1. デコレーター依存

TypeORM は @Entity、@Column、@OneToMany などのデコレーターに大きく依存しています:

// TypeORM: デコレーターだらけ
@Entity()
class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @OneToMany(() => Post, post => post.user)
  posts: Post[];
}

これにより、tsconfig の emitDecoratorMetadata と experimentalDecorators が必要になり、バンドルサイズも増加します。

2. 文字列ベースのクエリビルダー

// TypeORM: 文字列ベース
const posts = await repository
  .createQueryBuilder('post')
  .leftJoinAndSelect('post.user', 'user')
  .where('post.published = :published', { published: true })
  .orderBy('post.created_at', 'DESC')
  .getMany();

3. メンテナンスの停滞

TypeORM のリリースサイクルは遅く、バグ修正に時間がかかることが多いです。

Sutando:よりクリーンな代替

デコレーター不要

// Sutando: プレーンなクラスプロパティ
class User extends Model {
  table = 'users';
  
  relationPosts() {
    return this.hasMany(Post, 'user_id');
  }
}

メソッドチェーンのクエリ

// Sutando
const posts = await Post.query()
  .with('user')
  .where('published', true)
  .orderBy('created_at', 'desc')
  .get();

機能比較

機能 Sutando TypeORM
パターン Active Record Active Record + Data Mapper
デコレーター 不要 必須
スキーマ定義 クラスプロパティ デコレーター(@Entity, @Column)
クエリビルダー メソッドチェーン 文字列ベース
リレーション メソッドベース(hasMany など) デコレーターベース(@OneToMany など)
ソフトデリート 組み込み 手動実装
モデルイベント 組み込み Subscriber パターン
クエリスコープ 組み込み サポートなし

TypeORM から Sutando への移行

モデルの変換

// Before: TypeORM
@Entity()
class Post {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @Column({ default: false })
  published: boolean;

  @ManyToOne(() => User)
  user: User;
}

// After: Sutando
class Post extends Model {
  table = 'posts';
  casts = { published: 'boolean' };
  
  relationUser() {
    return this.belongsTo(User, 'user_id');
  }
}

クエリの変換

// Before: TypeORM
const posts = await repository
  .createQueryBuilder('post')
  .leftJoinAndSelect('post.user', 'user')
  .where('post.published = :val', { val: true })
  .getMany();

// After: Sutando
const posts = await Post.query()
  .with('user')
  .where('published', true)
  .get();

結論

TypeORM は Node.js コミュニティに貢献してきましたが、デコレーター依存、文字列ベースのクエリ、メンテナンスの停滞により、新規プロジェクトには推奨しづらい状況です。Sutando は同じ Active Record パターンを提供しつつ、よりクリーンな API と TypeORM に欠けている機能を備えています。

npm install sutando — または ドキュメント をお読みください。

このページは役に立ちましたか?