29
2017

SequelizeをTypeScriptで動かす2

CATEGORYJavaScript
1月に「SequelizeをTypeScriptで動かす」って自分でinterface定義して動かす手順を書いたけど、その後 sequelize-typescript なるそのものズバリで、遥かに使いやすく今風になったライブラリを見つけたので、改めてそっちの紹介やら手順を解説する。
…といっても、ぶっちゃけ凄く簡単に入って動いたので、ごく簡単にだけ。

まず、インストールはnpmから入れるだけで公式見れば済むので割愛。
次、モデル定義はこんな感じ。

models/administrator.ts
import { Table, Column, Model, DataType, AllowNull, Unique, Default, DefaultScope, Scopes } from 'sequelize-typescript';

@DefaultScope({
attributes: {
exclude: ['password'],
},
order: [['id', 'ASC']],
})
@Scopes({
login: {
attributes: {
include: ['password'],
},
},
})
@Table({
tableName: "administrators",
timestamps: true,
paranoid: true,
})
export default class Administrator extends Model<Administrator> {
@Unique
@AllowNull(false)
@Column
mailAddress: string;

@AllowNull(false)
@Column
password: string;

@AllowNull(false)
@Default('normal')
@Column({ type: DataType.ENUM, values: ['normal', 'super'] })
role: string;

comparePassword(password: string): boolean {
// 省略
}

static passwordToHash(password: string, salt?: string): string {
// 省略
}
}
あのややこしかったモデル定義が一変、ごく普通のクラスベースのモデルになりました!
…まあところどころ連想配列万歳の素のsequelizeが垣間見えていますが。良くも悪くもTypeScript用のラッパー的な感じなので、こうやってアノテーションになりつつも(多少見た目はごちゃごちゃするけど)sequelizeの豊富な機能を余さず使うことが出来そうという事で。

で、こうやってモデルを定義したら、次はブートローダーをこんな感じに記述する。
import "reflect-metadata";
import { Sequelize } from 'sequelize-typescript';

const sequelize = new Sequelize({
dialect: "mysql",
host: "localhost",
port: 3306,
username: "foo",
password: "bar",
name: "foobar",
modelPaths: [__dirname + '/models'],
logging: console.log,
});
sequelize.sync().then(() => {
// 省略
}).catch(console.error);
この辺も、素のsequelizeだとあんまり定まってなかったので、だいぶ書きやすくなった印象。

で、使い方ですが、これだけです。マジで。これだけで後は普通にモデルに Administrator.findAll() やらが出てくるので、普通のsequelize同様に使えばOK。素晴らしい。


昨日 TypeORM が使えるよって記事を書いたばかりですが、定番だった sequelize もこうやってTypeScriptで使えるとなると、今後も1強時代が続くかもしれない。
ただ、sequelize はActiveRecordで TypeORM は昔ながらのORMとちょっとジャンルが違うので、好みに応じて試してみるのもいいか?
スポンサーサイト

Tag: JavaScript TypeScript Sequelize

0 Comments

Leave a comment