Open4

Deno KV を試す

nikogolinikogoli

データベースの実体?の場所

TL; DR

deno info で出る DENO_DIR location 以下の\location_data\どれかのフォルダ\kv.sqlite3


Quick Start では、Deno.openKv()について以下のように説明されている。

In your Deno program, you can get a reference to a KV database using Deno.openKv(). You may pass in an optional file system path to where you'd like to store your database, otherwise one will be created for you based on the current working directory of your script.

この based on the current working directory なパスの意味がいまいちわかりにくい。

Document での説明は以下の通り。やはりよくわからない。

When no path is provided, the database will be opened in a default path for the current script. This location is persistent across script runs and is keyed on the origin storage key (the same key that is used to determine localStorage persistence).

若干古いものの、↓の情報を参考にしつつ調べてみると
https://til.simonwillison.net/deno/deno-kv

自分の環境 (Windows10) の場合では↓にデータベースのファイルがあった。
C:\Users\<*user-name*>\AppData\Local\deno\location_data\<*hash?*>\kv.sqlite3

上述のサイトの情報を見つつ適当に試してみたところ、以下のような流れっぽい。

  1. 適当\な\パス\test_kv.tsの中でDeno.openKv()すると
  2. 適当\な\パスに基づいて、C:\Users\<*user-name*>\AppData\Local\deno\location_data 以下にディレクトリが作成 or 取得されて
  3. そのディレクトリの中にkv.sqlite3が作成されて
  4. 以降、適当\な\パスで実行されたスクリプトではこのデータベースが共有される
nikogolinikogoli

連続的な kv.set() と deno test

よくある直列の await 処理の形式で実現できる。↓みたいな感じ。

const list = [ [key1, v1], [key2, v2], ... ]
await list.reduce((pre, [key, val]) => pre.then( async () => {
  const res = await kv.atomic()
     .check({key, versionstamp: null})
     .set(key, val).commit()
  console.log((res.ok ? "OK: " : "Failed: " ) + key.join(", "))
}), Promise.resolve())

ただし、deno test でこれを実行すると、以下のようなエラーが出る。

error: Leaking async ops:
  - 1 async operation to op_kv_atomic_write was started in this test, but never completed.
  To get more details where ops were leaked, run again with --trace-ops flag.

kv.atomic()を使わない場合もやはりエラーになり、メッセージ中のop_kv_atomic_write op_kv_snapshot_readに変わる。

調べたところdeno test の仕様?らしい。↓に解決方法が提示されている (が試していない)
https://github.com/denoland/deno/issues/15425

nikogolinikogoli

Deno Deploy を KV として使う

ローカルからconst kv = Deno.openKv( Deploy のURL )してデータを扱う感じ。

Deno Deploy のプロジェクトで KV を使うには何らかの実体が必要で、以下のどれかになる

  1. 既存の (無関係な) プロジェクトの KV を流用する
  2. 新規のプロジェクトを作成し、そのプロジェクトで KV だけを使う
  3. playground でプロジェクトを作成し、KV だけを使う


手順

  1. 上述の3つからどれかを選び、KV を使えるプロジェクトを用意する
  2. プロジェクトの情報のページの KV betaタブに移動し、"Set up access tokens for Deno CLI"のリンクをクリックする
  3. + New Access Tokenボタンを押し、DENO_KV_ACCESS_TOKENという名前でトークンを作成する
  4. 作成したトークンをコピーし、.env ファイルなりシステム環境変数なりにDENO_KV_ACCESS_TOKENという名前で保存する
  5. ---- 終わり ----
  6. あとは、情報ページKV betaタブの "Connect to this database from Deno CLI"のコードをローカルのスクリプトにコピペするだけ


その他1

KV に入れたデータは、情報ページKV betaタブ最下部の Data 部分で確認できる。

検索機能は kv.list({ prefix: [ ...入力した値 ] })相当なので、内容の確認にとても便利

その他2

現状、KV へのアクセスを確認する方法がないように見える。
Analytics タブに KV へのアクセスを表示する部分があるが、そこに記録されない (サイズの問題?)