Table of Contents
typescriptでSequelizeを使う
概要
TypescriptにおけるORMの選択肢は俺の知る限り3つメジャーなものがある。
typeorm、Prisma、Sequelizeである。
何れも試した結果、一番マシなものはSequelizeという結論に達した。
軽く触れておくと、2023年11月現在、typeormには設定一つでデッドロックを起こして即死させる致命的なバグがあり、一回プロダクションでやらかしてえらい目にあった。
一方機能面で非常に優れているPrismaだが、何故かsqliteのmemoryモードが使えないという仕様があり、テストが非常に書きにくいという問題がある。
というわけで消去法的に選んだSequelizeだが、これもこれで中々問題があり、まともにCRUD操作ができるようになるまで苦労したので動くまでの記録を示す。
前提
今回試した環境は以下。
- typescript 4.9.4
- electron 22.0.0
- vite 4.0.3
- sequelize 6.33.0
- sequelize-typescript 2.1.5
electron-vue-viteライブラリでボイラープレートを生成しており、この他にもelectronなのでvueとか使ってレンダラープロセスを書いているが割愛。
本体のsequelizeはjavascriptベースのライブラリであり、typescript向けのラッパーとしてsequelize-typescriptを用いている。
この「sequelizeはなまじ古くてtsに対する対応が甘め」という欠点をラッパーライブラリでゴリ押しているのが2023年現在の現状である。tsの公式対応がアナウンスされている7系はまだalphaだ。
結論
ts-configのcompilerOptionsに"useDefineForClassFields": false
を追加する。
これはts 3.7から導入された機能で、現在ではデフォルトがtrueになっている。
これをしないとどうなるかというと、sequelizeでgetしてきたオブジェクトの中身がgetterの動的な注入を阻害してundefinedになる。
具体的に言うとこんなコード↓を書いても通らないということだ。
const res = await User.create({name: "testit"});
expect(res.name).toBe("testit");
思うこと
ts碌なORMが無い
sequelize 7系はよ
TypeORMは開発がやる気なくて駄目だ
あんなもんをNestJSは公式で推すなバカ
追記
色々試した結果体外Sequelizeもゴミだった
Typeormがマシとか思いもよらんかった