[groonga-dev,03395] Re: groonga-clientとgroongaのログメッセージについて

アーカイブの一覧に戻る

Kouhei Sutou kou****@clear*****
2015年 8月 8日 (土) 17:06:04 JST


須藤です。

In <CA+Tq-RqLQGKXj2iqqXvO_iL6t2GQe1NZqO4Jr3KuLn931_DoGw****@mail*****>
  "[groonga-dev,03394] Re: groonga-clientとgroongaのログメッセージについて" on Fri, 7 Aug 2015 10:19:14 +0900,
  Hiroyuki Sato <hiroy****@gmail*****> wrote:

> 個人的には、次のように思います。
> 
> ・カラム名が間違えていて所定のカラムだけデータが入らなかった。
>  => 成功でも良い。
> 
> ・カラムの一部に不正な値が入っていて該当のレコードだけ、所定のカラムに
>  値が入らなかった。例: 数値のカラムに文字列が入っていた。
>  => エラーとして取り扱いたい。
> 
> つまり中途半端にデータが入るぐらいなら、エラーとして失敗してくれた方が良いです。

実は、Groongaはわりと入力に寛容で、数値のカラムに文字列を指
定しても自動でキャストして適切な方に変換しようとするんです。
なので、"1"(文字列)と指定しても1(数値)が入ります。さすが
に"abc"(文字列)と指定するとエラー扱いにはなります。ただ、
ログをみないとわからないです。loadの返り値だけではわかりませ
ん。

あと、Groongaはレコードベースではなくカラムベースのデータモ
デルなので、特定のカラムのロードが失敗したからといってレコー
ド全体での失敗にはしていないんです。レコードの追加(= 主キー
の挿入)ができたらload 1件という扱いになっています。

> ちょっと質問の仕方が悪かったかもしれないのでテストコードを作りました。
> https://github.com/hiroyuki-sato/groonga-log_test
> エラーとして表示されるんだけど、実際にはデータがインサートされています。
> 私のGroonga::Clientの使い方が間違えているのでしょうか?

実は、使い方を間違えています。

  ret = client.load({:table => 'Data',
                     :values => [data]})

なんですが、:valuesにはJSON形式の文字列を指定する必要があり
ます。

ただ、JSON形式の文字列ではなくRubyのオブジェクトを渡したい気
持ちはわかるので、↑でも動くようにしておきました。(内部で勝
手にJSON形式の文字列に変換する。)

なので、groonga-clientをアップグレードすると動くようになって
います。


ちなみに、↓がどうしてでるのかというと

>>   2015-08-05 21:12:20.668028|n| thread start (0/1)
>>   2015-08-05 21:12:20.668492|e| ignored invalid char('=') at
>>   2015-08-05 21:12:20.668514|e| [{"field"=
>>   2015-08-05 21:12:20.668524|e|            ^
>>   2015-08-05 21:12:20.668532|e| ignored invalid char('>') at
>>   2015-08-05 21:12:20.668539|e| [{"field"=>
>>   2015-08-05 21:12:20.668547|e|             ^
>>   2015-08-05 21:12:20.668555|e| ignored invalid char('=') at
>>   2015-08-05 21:12:20.668563|e| [{"field"=>"文字列", "field2"=
>>   2015-08-05 21:12:20.668570|e|                                           ^

[{"field" => "value"}].to_sの結果である

  [{"field"=>"value"}]

をJSONとしてパースしているからです。JSONなら

  [{"field":"value"}]

というように「=>」ではなく「:」とならないといけないので↑の
エラーメッセージがでています。が、Groongaは入力に寛容なので、
「=」も「>」も無視して、それっぽくパースした結果、データが入っ
ています。


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:
  http://www.clear-code.com/services/code-reader/




groonga-dev メーリングリストの案内
アーカイブの一覧に戻る