🦕

DenoからTextDBを扱うモジュールを作った

2021/08/25に公開

Denoでデータを保存したいとき、どのような方法を使っているでしょうか。
ローカルに保存するならテキストファイルなどに書き出すことができますが、オンラインに保存したい場合もあります。

既に、denodbという複数のDBに対応したORMがあります。
また、Deno Deployのチュートリアルでも、FaunaDBDynamoDBFirebaseを扱う方法が紹介されています。

しかし、個人的に開発の初期段階からしっかりした(という言い方も変ですが)DBを使うのはtoo-muchかな、という感じがしています。

簡単なデータ保存であれば、TextDBというサービスがミニマルで良いのではないかと思っています。

https://textdb.dev/

このTextDBを扱うDenoモジュールを作成したので紹介します。

TextDBとは

「APIが用意されているフリーのオンラインメモ」として使える便利なサービスです。
リポジトリはこちら。
https://github.com/bontaq/textdb

TOPページに行くとUUIDが発行され、https://textdb.dev/data/[id]のパスにアクセスして内容を確認できます[1]

curl -d "hello world" -H "content-type: text/plain" https://textdb.dev/api/data/[id]のようにPOSTリクエストを送ることでデータを追記できます。

TOPページには

A simple way to share small amounts of data

とあるので、本格的なデータストアとして使うのは無理だと思いますが、開発段階での単純なテキストデータや、自分用のメモを残す程度なら十分使えるのではないかと思います[2]

作成したtextdbモジュールの説明

textdbというモジュールを作りました。
https://deno.land/x/textdb

リポジトリはこちらです。
https://github.com/kawarimidoll/deno-textdb

TextDBJsonDBというクラスを提供しています。
インスタンスの初期化の際には、保存に使うTextDBのページIDが必要です。

使用例はモジュールおよびリポジトリのREADMEに記載しています。

TextDB

TextDBに保存されているデータをそのまま取得・更新できます。
以下のメソッドが定義されています。

get

保存されているテキストを取得します。

put

引数として渡されたテキストを保存します。
データは上書き保存となります。

clear

保存されているテキストを消去します。

JsonDB

TextDBにJSON形式でデータを保存し、KVSのように使用できます。
データはRecord<string, unknown>形式である必要があり、ただの文字列や数値の利用は想定していません。
以下のメソッドが定義されています。

all

データを全件取得します。

save / saveMany

引数として渡されたデータに_id(UUID v4形式)というプロパティを付加して保存します。
もし_idがデータ内にある場合は、それを用いてアップサート処理を行います。
返り値は保存されたIDです。

find / findMany

_idを用いて検索を行います。
返り値は見つかったデータです。

delete / deleteMany

_idを用いて削除を行います。
返り値は削除された件数です。

where

受け取ったレコード({ gender: "m" }など)を用いて一致検索を行います。
返り値は見つかったデータです。

clear

保存されているデータを消去します。

おわりに

TextDBおよびそれを扱うための自作モジュールtextdbの紹介記事でした。
オンラインでデータを保存・共有したいけど本格的なDBを使うほどでもない、という場合に便利かと思います。
また、不備や改善点が見つかりましたらIssueやPull Requestを出していただけるとありがたいです。

脚注
  1. パスはUUIDじゃなくて1とかでもアクセス可能ですが衝突防止のためUUIDを使うのが良いと思います ↩︎

  2. Elixir/Phoenixの知識がないので内部実装の詳しいところまではわかっていません… ↩︎

Discussion