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/