モダンな Node.js ORM
データベースとのやり取りをシンプルで美しく。
Sutando は Laravel Eloquent の優雅な開発体験を Node.js にたらします。流れるようなクエリビルダー、表現力豊かなモデルとリレーション、トランザクションやマイグレーションに、TypeScript の第一級サポート。
$ npm install sutando$ yarn add sutando$ pnpm add sutandoapp / 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');
}
};必要なものが、ぜんぶ揃っています
日常のデータベース作業に必要なものを、ひとつのツールボックスに — 生のクエリからモデルリレーションまで。