Skip to content
Sutando
Esc
↑↓navigate↵open⌘Jpreview
モダンな Node.js ORM

データベースとのやり取りをシンプルで美しく。

Sutando は Laravel Eloquent の優雅な開発体験を Node.js にたらします。流れるようなクエリビルダー、表現力豊かなモデルとリレーション、トランザクションやマイグレーションに、TypeScript の第一級サポート。

$ npm install sutando
$ yarn add sutando
$ pnpm add sutando
app / main.ts
import { Model } from 'sutando';

class User extends Model {
  declare id: number;
  declare name: string;
}

const user = new User();
user.name = 'John';
await user.save();

const users = await User.query()
  .where('age', '>', 18)
  .get();

対応

  • MySQL
  • PostgreSQL
  • SQLite
  • MariaDB
  • SQL Server
  • Oracle

邪魔をしない ORM

SQL を書く量を減らしつつ、制御はそのまま —— 必要なときは生の式も使えます。

見慣れたクエリビルダー

メソッドをつなげて、書こうとした SQL のままに読めるクエリを。パラメータのバインドは Sutando が処理します。

  • where、whereIn、join、orderBy による条件指定
  • count() と exists() による集計
  • paginate() によるページネーション、chunk() による大量データ処理
  • db.raw() による生の SQL とパラメータバインド
app/queries.ts
import { sutando } from 'sutando';

const db = sutando.connection();

const users = await db.table('users')
  .where('votes', '>', 100)
  .whereIn('status', ['active', 'pending'])
  .orderBy('name')
  .take(10)
  .get();

モデルとリレーション

数行でモデルを定義し、テーブル同士の関係をそのまま書き下せます。関連の読み込みが N+1 になることはありません。

  • hasOne、hasMany、belongsTo、belongsToMany
  • with() によるイーガーロード — N+1 ではなく 2 クエリ
  • アクセサ、ミューテータ、キャスト、クエリスコープ
  • ソフトデリート — restore() と forceDelete()
models/user.ts
import { Model } from 'sutando';

class User extends Model {
  declare id: number;
  declare name: string;

  relationPosts() {
    return this.hasMany(Post);
  }
}

// two queries, not N+1
const user = await User.query().with('posts').find(1);

user.posts.count();

バージョン管理できるスキーマ

マイグレーションビルダーでスキーマを定義し、コミットする。すべての環境が同じ手順で追いつきます。

  • 流れるスキーマビルダー:createTable、カラム、インデックス、外部キー
  • ロールバック可能な up / down マイグレーション
  • npx sutando migrate:run で実行、migrate:status で確認
  • MySQL、PostgreSQL、SQLite、MariaDB、SQL Server に対応
migrations/create_users_table.js
const { Migration } = require('sutando');

module.exports = class extends Migration {
  async up(schema) {
    await schema.createTable('users', (table) => {
      table.increments('id');
      table.string('name');
      table.string('email').unique();
      table.timestamps();
    });
  }

  async down(schema) {
    await schema.dropTableIfExists('users');
  }
};

始める準備はできましたか?

Sutando をインストールして、1 分以内に最初のクエリを実行しましょう。