2017年3月16日木曜日

コマンドプロンプトでgroongaのまとめ


groongaさん日本生まれの英国仕様なのでドキュメントが日本人向けでないです。でもgroongaさんはDBだそうなので、DB的に使ってみようとした際のTipsです。ちなみにコマンドプロンプトです。以下cmdです。

OS:Win7
Ver:groonga7.0.0_x64[zip版]
前提:コマンドプロンプトでgroonga.exeがあるフォルダにcdコマンドで移動済み。

DB作成、削除
DB作成
めんどくさいのでgroongaと同じフォルダにDBを作ります。注意点として、groonga.exeを実行したcmdでやってはいけません。通常のcmdで、groonga.exeのフォルダまで移動して打ってね。
groonga -n --encoding sjis ./[テーブル名]
これを打つとDB作成と同時にDBにアクセスします。
ちなみにsjisでエンコードしてないと(cmdのエンコがsjisの拡張版cp932だから)cmdで日本語が扱えません。英国生まれなのでそんなことドキュメントに体系的に書いて無いので最初から日本語使えなくて即死します。日本生まれのメリットを初手から潰してくるgroongaさんまじぱねっす。
DB削除
消し方はあれです。なんかファイル作られてるでしょ。それをゴミ箱にぽいして。更新日付順に並び替えば上から4個くらいがなんか作られてるのでそれを捨てて。

DBへのアクセス
注意点として、groongaexeを実行したcmdでやってはいけません。通常のcmdで、groonga.exeのフォルダまで移動して打ってね。
groonga ./【テーブル名】
はい、DBにアクセスします。以降のTipsはDBにアクセスした状態で打ってね!!
テーブルの作成、削除
テーブルの作成
はい、普通のテーブルの作り方です。
table_create --name 【テーブル名】 --flags TABLE_HASH_KEY --key_type 【型】
型ってなんですか?って感じだけど、groongaのテーブル作成は非常に特異です。テーブルを作成する際、主キーとなるカラムと一緒に作ります。それ以降のカラムは別のコマンドで随時追加していく感じになります。SQL的に言うと以下の感じを1行でぶち込みます。
Create Table 【テーブル名】 {
 _id int64 autoincrement
,_key 【型】 not null primary_key
}
ちなみに_idとか_keyとか言うカラム名は固定でしかも付いてきます。くそですね。一応_idとか取れるらしいが通常はあっても無くても極限性能でなければ人間の感じ取れる性能差は変わらないので気にしなくていいらしいです。

あと型は色々あります。以下を参照。
データの種類
テータの型
カラムの追加
下の感じです。
column_create --table 【テーブル名】 --name 【カラム名】 --flags COLUMN_SCALAR --type 【型】
ちなみにカラムに配列を指定することもできます
column_create --table 【テーブル名】 --name 【カラム名】 --flags COLUMN_VECTOR --type 【型】
完全にAlterTableのColumnAddのノリですね。

あと型は色々あります。以下を参照。(2度目)
データの種類
テータの型

テーブルの削除
削除するテーブルを参照してる他のテーブルが無ければこれで消せます。
table_remove 【テーブル名】
消せない場合は消しちゃうと色々影響でかいという事なのでがんばって影響されるテーブルを探して順次依存を解消していこうね。

レコードの登録、更新、削除
いよいよ更新系クエリですね。

登録と更新は以下のとおり。ん?更新も兼ねているのかって?そうだけど。
load --table [テーブル名]
[
{【カラム名】:【値】}
]
SQL的に言うとINSERT … ON DUPLICATE KEY UPDATEですね。ちなみに更新は主キー、つまり_keyの値で判断してるよ。ただのInsertは無いよ。

複数のカラムに値を入れるとか、複数のレコードを一気に登録したい場合
load --table [テーブル名]
[
 {【カラム名】:【値】,【カラム名】:【値】}
,{【カラム名】:【値】,【カラム名】:【値】}
,{【カラム名】:【値】,【カラム名】:【値】}
]
主キーに適当な文字列を入れたい場合は以下のような感じ
load --table 【テーブル名】
[
 {_key:"いろは"}
,{_key:"にーほ"}
,{_key:"へいと"}
]

削除は以下のとおり
delete --table 【テーブル名】 --filter "【Where句】"
ちなみに主キー直指定で1個ずつ消したりもできる。

消してぇ・・・・全消ししてえよ・・・・!!
って方は以下のトランケートで
truncate --table 【テーブル名】

レコード検索
ただWhere句がまたしても癖の塊なのでドキュメントを参考にしながら組み立てるといいです。
select --table 【テーブル名】 --filter "【Where句】"
ちなみにLimitOffset句もある。
select --table 【テーブル名】 --offset 【数値】 --limit 【数値】


おまけ
エスケープとか、Windowsのパスとか、日本のお値段としてよく使う「\」なんだけど、バグでエスケープがドキュメント通りにいきません。
・「"」でクオート時、「\"」「\\」を中に入れると「\"」「\\」が出る⇒エスケープもそのまま出す。
・「\'」「\(」を中に入れると「'」「(」が出る⇒エスケープされた文字が出る。
ちなみに以下の文字列をloadコマンドで登録すると
load --table DataObj
[
{_key:"\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z\\1\2\3\4\5\6\7\8\9\0"}
]
"a\bcde\fghijklm\nopq\rs\t\u0000xyz\\1234567890"
エスケープ込みの特殊文字入れすぎでひどい。