はじめに
お久しぶりです。
久しぶりの技術投稿です。
最近は、触れる技術が増えてきていて、新しい技術に対して、こまかく状況を整理しながらプロジェクトを進めるのが、なかなか辛いなと思う今日この頃です。
さて現在、それなりの規模感?なデータ基盤の構築を進めております。
このデータ基盤では、時系列のデータを取り扱うため、データを時系列とすべく、レコードIDとは別個でユニークなIDを持ちたいと考えており、ここでPosgreSQLでシークエンステーブルを活用したIDを振っていこうということになりました。
このとき、いろいろと情報ソースを探しましたが、日本語ではまともな情報がないように感じたので、私が実装したやり方を公開させていただきます。
同じ問題で困っている方の参考になったらいいなと思いつつ、もっとすごい方に、あわよくばアドバイスいただけたら嬉しいなんて思ってます。
課題の共有
NestJSxTypeORMxPostgreSQLでSequentialなデータを取得するには?
シークエンステーブルってなんヨ?って方はこの投稿を見る前にこちらを見た方が良いかもしれません。
シークエンステーブルのいいところ
一回読み取ったら、もうそのIDは発行されない。
このため、毎度、必要な際にSelectすればいいだけなのでとっても便利。
TypeORMの設定
結論からいうと、TypeORMからシークエンステーブルを定義するのはできないと認識しました。すくなくとも公式では触れられていないと思います。
そのため、pgAdminから下記のようにテーブルを定義しました。
$ CREATE SEQUENCE property_sequence OWNED BY property.unique_id
NestJSからNextValの取得
こちら、もちろん、専用のものは用意されていないので下記のように普通にSelect文を実行しました。
ソースはこちら
async getNextVal(): Promise<number> { const sequenceName = 'property_sequence' const query = getManager() const result = await query.query(`select nextval('${sequenceName}')`).then((data) => { return data[0].nextval; }) return result; }
これだけなんですが、だれかのお役にたてばうれしいです。