Kaleidoxはレコードを記述するRecordというオブジェクトを提供しています。
RecordはKaleidoxの中軸となるオブジェクトで、データ処理を行う場合などRecordをハブにして様々な連携を行うようになっています。
今回はRecordの使い方について説明します。
準備
Recordをデータベース入出力で使用するための環境としてKaleidoxの初期化ファイルinit.kldに以下の設定をします。
この設定をしておくと、H2データベースのメモリデータベース上にpersonテーブルが作成され、1レコードが格納された状態になります。
* env db.default.driver="org.h2.Driver" db.default.url="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" * voucher ** person #+caption: 特性一覧 |特性 | 名前 | 型 | 多重度 | ラベル | |------+------+--------+--------+---------| | 属性 | id | int | 1 | User ID | | 属性 | name | string | 1 | 名前 | | 属性 | city | string | ? | 市 | * main store-create 'person store-insert 'person id:100,name:Taro,city:Yokohama
入力
LXSVによるリテラル記述とデータベース読込みでRecordを作成することができます。
LXSV
LXSVリテラルによってRecordを作成することができます。
kaleidox> name:Taro,city:Yokohama name:Taro city:Yokohama
showコマンドで内容を表示すると2つのプロパティを持つRecordであることが分かります。
kaleidox> :show Record[2] name:Taro city:Yokohama
データベース読込み
Kaleidoxでは、データベースアクセスの仕組みとして以下の2つを用意しています。
- Store
- データストア機能
- SQL
- SQLで直接データベースアクセス
Store
データストア機能を使うと、スキーマ定義といったメタ情報を登録することで、データベースに対してレコードベースのインタフェースでアクセスすることができます。
store-get関数ではデータベースのテーブルからデータをRecordとして読み込むことができます。
以下ではpersonテーブルからID 100のRecordを取得しています。
kaleidox> store-get 'person 100 ID:100 NAME:Taro CITY:Yokohama
データストアからstore-selectでRecordを検索すると、検索結果がテーブルを記述するTableオブジェクトに格納されて返されます。
以下ではstore-selectに検索条件を指定せずテーブル名のみを指定しているので全件検索になります。(ただし、読込件数はデフォルト値の件数で制限されます。)
kaleidox> store-select 'person Table[3x1]
読み込んだTableの詳細情報を表示すると以下になります。
kaleidox> :show Table[3x1] ┏━━━┯━━━━┯━━━━━━━━┓ ┃id │name│city ┃ ┣━━━┿━━━━┿━━━━━━━━┫ ┃100│Taro│Yokohama┃ ┗━━━┷━━━━┷━━━━━━━━┛
Tableはオブジェクトなのでプロパティまたはメソッドを使って必要な情報を取り出すことができます。
ここではheadメソッドを使用して先頭の要素を取り出しています。この先頭の要素は本記事のテーマであるRecordとして取り出されます。
kaleidox> .head id:100 name:Taro city:Yokohama kaleidox> :show Record[2] name:Taro city:Yokohama
SQL
データストア機能を使わず直接SQLを使用してデータベース内のデータをTableとRecordとして取得することもできます。
sql関数でSQL文を指定するとSQLが発行されます。SELECT文の場合は結果がTableとして返ってきます。
前述したとおり、Tableオブジェクトのheadメソッドを呼び出すと先頭の行がRecordとして返ってきます。
kaleidox> sql "select * from person" Table[3x1] kaleidox> :show Table[3x1] ┏━━━┯━━━━┯━━━━━━━━┓ ┃ID │NAME│CITY ┃ ┣━━━┿━━━━┿━━━━━━━━┫ ┃100│Taro│Yokohama┃ ┗━━━┷━━━━┷━━━━━━━━┛ kaleidox> .head ID:100 NAME:Taro CITY:Yokohama
出力
データストア機能を使ってRecordをデータベースに格納することができます。
以下ではstore-insert関数を使って、personテーブルにRecordを追加しています。
kaleidox> store-insert 'person id:101,name:Hanako,city:Kawasaki (101) kaleidox> store-get 'person 101 ID:101 NAME:Hanako CITY:Kawasaki kaleidox> store-select 'person Table[3x2] kaleidox> :show Table[3x2] ┏━━━┯━━━━━━┯━━━━━━━━┓ ┃id │name │city ┃ ┣━━━┿━━━━━━┿━━━━━━━━┫ ┃100│Taro │Yokohama┃ ┃101│Hanako│Kawasaki┃ ┗━━━┷━━━━━━┷━━━━━━━━┛
参照
Recordの内容はプロパティとして参照することができます。
以下のように変数にpにRecordを束縛します。
kaleidox> setq p id:100,name:Taro,city:Yokohama id:100 name:Taro city:Yokohama
プロパティ取得
プロパティ取得は以下のようにオブジェクトのプロパティを参照することで行なえます。
kaleidox> p.name "Taro"
XPath
XPathを使ってRecordからプロパティ取得することもできます。
kaleidox> /name p "Taro"
まとめ
今回はKaleidoxの中軸オブジェクトであるRecordについて説明しました。
次回はもう一つの中軸オブジェクトであるTableについて説明する予定です。
諸元
- Kaleidox : 0.1.7