🦕

ローカルでのDeno KV動作時のデータ構造

2023/09/22に公開
  • Denoには組み込みのKey Value Storeがあり、外部ストレージを用意せずとも簡単にデータの出し入れが可能です。
  • 今回はローカルで使用してみて、動作やデータファイル群の場所などの確認を行います。

環境

  • deno 1.36.4

内容

基本的な使用

  • まず、Deno KVで「接続・書き込み・読み取り」を行う基本的なコードを示します。
    • ※各オプションについては今回は割愛します。
// 接続
const kv = await Deno.openKv();

// 書き込みデータ
const book1 = {
  title: "hoge",
  desc: "very hoge."
}

// 書き込み
await kv.set(["books", book1.title], book1);

// 読み取り
const result = await kv.get(["books", book1.title]);

// 結果出力
console.log(result.value)
  • 上記のコードを例としてsample.tsというファイルに書き込んで実行した結果が以下です。
$ deno run -A --unstable sample.ts

{ title: "hoge", desc: "very hoge." }

データファイル

  • まずDenoからデータベースへ接続するためにはopenKvメソッドを使用します。
  • デフォルトでは構成なしで以下の環境に自動的に接続します
    • ローカル: SQLite
    • Deno Deploy: FoundationDB
  • プログラムが実行されると、ローカルではデフォルトでは以下の場所にSQLiteのデータファイルが作成されます。
# 格納先
$ ls $HOME/Library/Caches/deno/location_data

xxxxx111111111xxxxxxxxxxx11111111111

# データファイル
$ ls $HOME/Library/Caches/deno/location_data/xxxxx111111111xxxxxxxxxxx11111111111

kv.sqlite3
  • またデータファイルの場所を指定したい場合は以下のように記述します。
    • ※例としてスクリプトファイルと同じディレクトリに「tmp.db」という名前で保存します。
const kv = await openKv("tmp.db");

// 省略
  • 修正して再実行すると、指定した場所に3つのSQLite関連のファイルが作成されていることを確認します。
# ファイル確認
$ ls

sample.ts	tmp.db		tmp.db-shm	tmp.db-wal

# ファイルタイプ確認
$ file tmp.db*

tmp.db:     SQLite 3.x database, last written using SQLite version 3043001, writer version 2, read version 2, file counter 1, database pages 1, cookie 0, schema 0, unknown 0 encoding, version-valid-for 1
tmp.db-shm: data
tmp.db-wal: SQLite Write-Ahead Log, version 3007000

# 書き込みログ確認
$ strings tmp.db-wal

:SQLite format 3
+tablekvkv
CREATE TABLE kv (
  k blob primary key,
  v blob not null,
  v_encoding integer not null,
  version integer not null
******
******
******
  • このことからDeno KVではSQLiteのwalモードを利用していることがわかります。
    • shmファイル: Shared Memory File。SQLiteデータベースの同時アクセスをサポートするために使用。
    • walファイル: Write-Ahead Logging File。データベースへの書き込み操作に対するログを保存し、トランザクションの整合性を確保するために使用。

スキーマ

  • 次に作成されたデータファイルの中身を任意のクライアント(例: TablePlus)で確認します。
  • 作成されたtmp.dbをTablePlusで開きます。
  • 確認すると、以下のようなスキーマとなっています。

image.png

  • 試しに上記の基本的なプログラムを以下のように変えて実行した後のデータの中身を見てみます。
// データ変更
const book1 = {
  title: "fuga",
  desc: "very fuga."
}

// 省略
  • 実行後、以下のようにdata_versionkvテーブルなどに更新及び追加がされていることを確認します。

data_version.png

kv.png

まとめ

  • Deno KVでは構成なしでプログラムから簡単に高機能なKey Value Storeを利用することができます。
  • その容易さを構成しているものを深掘ることで、恩恵をより感じることができると感じました。

参考

Discussion