Hiroyuki Sato
hiroy****@gmail*****
2015年 8月 10日 (月) 09:15:48 JST
須藤様 佐藤です。 ご対応ありがとうございます。 うぅ、JSONだったとは、恥ずかしい。 それはエラーになりますね。失礼しました。 2015年8月8日 17:06 Kouhei Sutou <kou****@clear*****>: > 須藤です。 > > 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だったとは、、、失礼しました。 データが入っていたのでこれで良いと思っていました。 > > ただ、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 mailing list > groon****@lists***** > http://lists.osdn.me/mailman/listinfo/groonga-dev -- Hiroyuki Sato