kevy
このページ

kevy-cli のリレーショナルコマンド

redis-cli にできることは、kevy-cli にもすべてできます。それに加えて、kevy の リレーショナルな側面——テーブル、インデックス、 ビュー——を扱うツールがあります。カタログを行として読む、クエリをページ単位で 実行する、宣言をダンプして復元する、CSV を入出力する、といった用途です。

ツールは接続オプションの後の --kevy に続けて書き、ツール名より後の引数はすべてそのツールの ものです。--kevy がなければ、最初の単語はサーバーコマンドで、redis-cli とまったく同じです:

kevy-cli -p 6004 --kevy tables     # ツール
kevy-cli -p 6004 TABLE.LIST        # コマンド。redis-cli と同じ形式で表示

ツールは同じ接続オプション(-h、-p、-s、-u、-a、--user、-n、-2/-3)を 使うので、認証やデータベース選択はコマンドを送るときとまったく同じです。

カタログを読む

tables、indexes、views は各カタログを行として一覧します。どれも名前のグロブを 受け付け、indexes はテーブル名も受け付けます。describe はテーブル、インデックス、 ビューのどれでも受け付けます:

kevy-cli -p 6004 --kevy tables 'user*'
kevy-cli -p 6004 --kevy indexes users
kevy-cli -p 6004 --kevy describe users      # 列、その型、その列を読むパス
kevy-cli -p 6004 --kevy describe+ users     # 同じ内容のあと TABLE.VERIFY

テーブルに対しては、プレフィックスと主キー、各列の宣言された型とその列を読むコンパイル済み パス、各アクセスパスの構築状態を表示します。インデックスに対してはフィールド、保存値、 それをコンパイルしたテーブルを、ビューに対しては合成ツリーと並び順を表示します。列の情報は TABLE.DESCRIBE から取得するため、7.0 より前のサーバーでは使えません。

クエリ

query は IDX.QUERY または VIEW.QUERY を実行して行を表示します。--all を付けると カーソルをたどってページごとに取得し、--max-rows(既定 10,000)に達するとページの 区切りで止まって、続きを取るカーソルを示します:

kevy-cli -p 6004 --kevy query --all IDX.QUERY users.age RANGE 18 65 FIELDS name
kevy-cli -p 6004 --kevy explain users.age RANGE 18 65
kevy-cli -p 6004 --kevy explain --analyze IDX.QUERY users.age RANGE 18 65
kevy-cli -p 6004 --kevy advise
kevy-cli -p 6004 --kevy sql run "SELECT id, name FROM users WHERE age BETWEEN 18 AND 65"

explain --analyze はクエリを実際に実行し、このクライアントが計測した値——往復回数、 ページ数、行数、経過時間——を報告します。サーバー側のプロファイルではありません。

sql run は SELECT を 1 文受け取り、宣言済みのテーブルに対してクライアント側で計画を 立て、それに答える IDX.QUERY を送ります。表示するのは SELECT で指定した列だけです。 サーバーが SQL を見ることはありません。宣言済みのどのパスでも答えられないクエリは、 kevy-cli --kevy sql plan と同じ文面で拒否され、宣言すべきインデックスが示されます——ここに、 スキャンで WHERE を補うツールはありません。

宣言をファイルにする

kevy-cli -p 6004 --kevy show-create users                # それを再作成する TABLE.DECLARE
kevy-cli -p 6004 --kevy show-create users --as sql       # CREATE TABLE / CREATE INDEX
kevy-cli -p 6004 --kevy dump --schema > schema.kevy      # テーブル、インデックス、ビューの順
kevy-cli -p 6005 --kevy run -f schema.kevy               # 別のサーバーで再実行
kevy-cli -p 6004 --kevy dump --all ./dump                # スキーマと各テーブルの行(CSV)
kevy-cli -p 6005 --kevy load ./dump                   # 行、宣言、wait-ready、doctor

kevy 形式は 1 行 1 コマンドで、run -f が同じ単語として読み戻せるようにクォートされます。 SQL 形式は kevy-cli --kevy sql compile が同じ宣言に戻せる SQL です。SQL で表せない部分—— <table>: 以外のキープレフィックス、WINDOW、AUTODECLARE——は捨てずに -- not carried by SQL コメントとして残します。テーブルがコンパイルしたインデックスには 独自の宣言がないため、show-create users.age はそのテーブルを示します。

dump --all は新しいディレクトリか空のディレクトリにだけ書き込みます:schema.kevy、 tables、テーブルごとの table-N.csv です。含まれるのはテーブルのプレフィックス下の行の、 宣言された列だけです。キー空間をバイト単位でそのまま写すには kevy-cli --kevy export を使います。 load は先に行を取り込み、後で宣言するので、各インデックスは書き込みのたびに更新される のではなく、行から一度だけ構築されます。(restore --from … --to … はオフラインの バックアップ復元で、別の層です。)

CSV の入出力

kevy-cli -p 6004 --kevy import-csv users.csv --table users --header
kevy-cli -p 6004 --kevy import-csv users.csv --prefix user: --pk id --columns id,name,age
kevy-cli -p 6004 --kevy export-csv --table users users.csv
kevy-cli -p 6004 --kevy export-csv --table users --via "IDX.QUERY users.age RANGE 18 65" -

import-csv は 1 レコードにつき 1 つの hash を書き、512 件ずつパイプラインで送ります。 進捗は <file>.progress に記録され、--resume でそこから再開します。空のセルは フィールドを書きません。欠けたフィールドが NULL です。--table を付けるとプレフィックス、 主キー、列をテーブルの宣言から取り、宣言された列だけを書きます。--key-column は、 export-csv が書き出す列のように、ある列からキー全体をそのまま取ります。

export-csv は RFC 4180 形式の CSV を、キーを先頭列にして書きます。--via がなければ SCAN でキーを探すのでキー空間全体をたどります。--via があればそのクエリをページ単位で 取得します。

スクリプト、待機、監視

kevy-cli -p 6004 --kevy run -f migrate.kevy --atomic
kevy-cli -p 6004 --kevy wait-ready --table users --timeout 60
kevy-cli -p 6004 --kevy watch 2 IDX.LIST
kevy-cli -p 6004 --kevy status
kevy-cli -p 6004 --kevy feed follow --prefix user: --from tail --checkpoint feed.pos

run は -f のファイルと -c のコマンドを 1 行ずつ実行し、すべて成功すれば 0、 使い方の誤りなら 1、接続が切れたら 2、エラー応答で止まったら 3 で終了します(--force なら続行)。--atomic はスクリプトを MULTI/EXEC で包み、失敗したコマンドが他を 取り消さないことを明示します。wait-ready は指定したインデックスの構築が終わるまで IDX.LIST をポーリングします。

REPL では

バックスラッシュで始まる行は kevy-cli が処理し、サーバーには送りません。\<tool> [args] は --kevy <tool> と同じように任意のツールを実行し、psql 風の短縮形もあります:

行動作
\dt [pattern]tables
`\di [table\pattern]`indexes
\dv [pattern]views
\d name / \d+ namedescribe / describe+
\query … / \dump --schema / 任意の \<tool>そのツール
\watch seconds command…watch
\i filerun -f file
\conninfostatus
\x / \timing展開表示 / コマンドごとの経過時間の切り替え
\?この一覧

kevy サーバーに接続していれば、Tab キーで、名前を受け取るコマンドの後にテーブル、 インデックス、ビューの名前を補完します。テーブルのパスに対する IDX.QUERY の中では、 FIELDS、FILTER、SORT、DISTINCT、FACET の後にそのテーブルの列名を補完します。

出力形式

kevy-cli -p 6004 --kevy tables --format csv
kevy-cli -p 6004 --json --kevy tables
kevy-cli -p 6004 --kevy query IDX.QUERY users.age RANGE 18 65 --null NULL --expanded

端末に出力するときは行を揃えた表として、パイプに流すときはタブ区切りで出力します。 --format table|tsv|csv|json で選べ、redis-cli の --csv、--json も有効です。 --no-header、--null <text>、--expanded、--timing は行を出力するすべてのツールで 使えます。表形式では、制御文字と UTF-8 でないバイトを \xHH で表示します。

ツール名とサーバーコマンド

--kevy のない単語は、大文字でも小文字でも常にサーバーコマンドです。watch、dump、 restore は Redis と Valkey のコマンド、backup と digest は Redis 8 のコマンドで、 コマンド表はリリースごとに増えます。そのため kevy のツールは裸の単語を使わず、すべて --kevy という一つのオプションの後ろに置きます。redis-cli 自身のクラスタ管理が --cluster の後ろにあるのと同じです。

kevy-cli 6.4 はこれらのツールを裸の単語で出していました(kevy-cli doctor -p 6004、 kevy-cli export …、kevy-cli sql compile … --url h:p)。7.0 からは、これらの単語もほかの 単語と同じくサーバーに送られます。接続オプションを先に、ツールを --kevy の後ろに書きます。 例:kevy-cli -p 6004 --kevy doctor。