1

RubyとDatamapperを使用して大量のレコードをMySQLデータベースにロードしています。これらのレコードはほとんどが挿入物ですが、かなりの数の更新があります。基本的に、データベース内のこれらのレコードのすべての列を「アップサート」したいと思います。私が見つけることができる唯一のオプションは次のとおりです。

1)レコードを照会します。存在する場合は、更新します。そうでない場合は、レコードを作成します。(常に1つの追加クエリ)2)新しいレコードを作成してみてください。重複するキーエラーをキャッチします。既存のレコードを照会します。それらのレコードを更新します。(更新がある場合、2つの追加クエリ)

On Duplicate Key UpdateMySQLの方がはるかに効率的だと思われるので、利用したいと思います。Datamapperでこれを行う方法はありますか?他に何か提案はありますか?

4

2 に答える 2

0

これは、すぐにサポートされる機能ではありませんが、一括挿入を行う場合は、トランザクション内で行うと、追加のクエリを使用した場合でもより効率的になります。またfirst_or_new、新しいレコードに複数の挿入を行わないように使用します。

DataMapper.respository.transaction.commit do
  Zoo.raise_on_save_failure = true
  bunch_of_updates.each do |key, new_attributes|
    zoo = Zoo.first_or_new(the_key: key)
    zoo.attributes = new_attributes
    zoo.save
  end
end
于 2012-08-23T21:37:58.520 に答える
0

これで使えるはずですfirst_or_createドキュメントから:

zoo = Zoo.first_or_create(:name => 'The Glue Factory')

またはソースで grep を実行しても一致するものは得られなかったので、サポートされていない可能性がありOn Duplicate Key Updateます。この機能を必要とするほど効率が重要な場合は、プレーン SQL に頼る必要があるかもしれません。do/do_mysqldm-mysql-adapter

于 2012-08-23T21:14:46.900 に答える