Deno KV を試す
0. Deno KV を試す
Deno.openKv()
するスクリプトの実行には、--unstable
フラグが必要
データベースの実体?の場所
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).
若干古いものの、↓の情報を参考にしつつ調べてみると
自分の環境 (Windows10) の場合では↓にデータベースのファイルがあった。
C:\Users\<*user-name*>\AppData\Local\deno\location_data\<*hash?*>\kv.sqlite3
上述のサイトの情報を見つつ適当に試してみたところ、以下のような流れっぽい。
-
適当\な\パス\test_kv.ts
の中でDeno.openKv()
すると -
適当\な\パス
に基づいて、C:\Users\<*user-name*>\AppData\Local\deno\location_data
以下にディレクトリが作成 or 取得されて - そのディレクトリの中に
kv.sqlite3
が作成されて - 以降、
適当\な\パス
で実行されたスクリプトではこのデータベースが共有される
連続的な 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
の仕様?らしい。↓に解決方法が提示されている (が試していない)
Deno Deploy を KV として使う
ローカルからconst kv = Deno.openKv( Deploy のURL )
してデータを扱う感じ。
Deno Deploy のプロジェクトで KV を使うには何らかの実体が必要で、以下のどれかになる
- 既存の (無関係な) プロジェクトの KV を流用する
- 新規のプロジェクトを作成し、そのプロジェクトで KV だけを使う
- playground でプロジェクトを作成し、KV だけを使う
手順
- 上述の3つからどれかを選び、KV を使えるプロジェクトを用意する
- プロジェクトの情報のページの
KV beta
タブに移動し、"Set up access tokens for Deno CLI"のリンクをクリックする -
+ New Access Token
ボタンを押し、DENO_KV_ACCESS_TOKENという名前でトークンを作成する - 作成したトークンをコピーし、.env ファイルなりシステム環境変数なりにDENO_KV_ACCESS_TOKENという名前で保存する
- ---- 終わり ----
- あとは、情報ページ
KV beta
タブの "Connect to this database from Deno CLI"のコードをローカルのスクリプトにコピペするだけ
その他1
KV に入れたデータは、情報ページKV beta
タブ最下部の Data 部分で確認できる。
検索機能は kv.list({ prefix: [ ...入力した値 ] })
相当なので、内容の確認にとても便利
その他2
現状、KV へのアクセスを確認する方法がないように見える。
Analytics タブに KV へのアクセスを表示する部分があるが、そこに記録されない (サイズの問題?)