1

我正在使用 Ruby 和 Datamapper 将大量记录加载到 MySQL 数据库中。这些记录主要是插入,但有相当数量的更新。我基本上想“更新”数据库中这些记录的所有列。我能找到的唯一选择是:

1) 查询记录。如果存在,请更新它。如果没有,请创建一个记录。(总是一个额外的查询) 2)尝试创建一个新记录。捕获重复的键错误。查询现有记录。更新这些记录。(当有更新时,2 个额外的查询)

我想使用 MySQL On Duplicate Key Update,因为它看起来效率更高。有没有办法在 Datamapper 中做到这一点?还有其他建议吗?

4

2 回答 2

0

您应该可以使用first_or_create它。从文档

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

我没有通过On Duplicate Key Updatedo/do_mysqlordm-mysql-adapter源中 grepping 得到任何匹配,所以它可能不支持它。如果效率对于需要此功能非常重要,您可能需要求助于普通 SQL。

于 2012-08-23T21:14:46.900 回答
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 回答