我正在使用rake任务来使用一些初始数据填充我的数据库。我想在表格中创建一堆条目,并且前几个ID,所以它们始终存在,并始终具有这些ID。我不介意在开发环境中有人添加/删除/修改记录,但我总是希望前5个ID具有值。这里是我的lib /任务/ bootstrap.rb文件的简化版本:当ID已经存在时创建失败
namespace :bootstrap do
desc "Create the default problem types"
task :default_problem_types => :environment do
ProblemType.create(:id => 1, :name => 'Wrong location', :description => 'blah')
ProblemType.create(:id => 2, :name => 'Wrong name', :description => 'blah')
ProblemType.create(:id => 3, :name => 'Wrong details', :description => 'blah')
ProblemType.create(:id => 4, :name => 'Duplicate', :description => 'blah')
ProblemType.create(:id => 5, :name => 'No longer exists', :description => 'blah')
end
desc "Run all bootstrapping tasks"
task :all => [:default_problem_types]
end
能正常工作的空数据库。它创建于problem_types表5个新条目:
1 - Wrong Location
2 - Wrong name
3 - Wrong details
4 - Duplicate
5 - No longer exists
的问题是,如果我运行它第二次,它会创建5分新的记录,使用标识6,7,8,9,10,这就是尽管事实上,我向已经存在的create()调用提供了id。我期待这些呼叫失败,因为如果我尝试做以下SQL:
insert into problem_types (id, name, description) values (1, 'foo', 'bar');
...失败:
ERROR 1062(23000):对于重复键输入'1' PRIMARY'
如果ID已经存在,如何获取create()方法失败?
谢谢。
你为什么使用rake任务而不是种子?使用种子,如果你正确地清理你的数据库,你总是可以有1-5的id。 – 2013-02-18 21:00:30
我正在使用rake任务,因为我遇到了另一个推荐的帖子,而我对种子并不熟悉。但是,在阅读您的评论之后,我查了一下种子,并认为种子更合适。 – antun 2013-02-19 22:10:04
我正在切换到种子,但是当我执行ProblemType.delete_all时,然后重新创建它们(使用ProblemType.find_or_initialize_by_name()),ID不会从1-5开始;他们不断增加。 (我在本地使用mySQL)。是否有另一种方法来正确清理数据库? – antun 2013-02-26 03:40:27