更快的编写此rake命令的方法 - rake db:drop db:create db:migrate db:seed

7
每当我有数据库结构的变更或新的迁移文件时,我都会运行这个命令:
rake db:drop db:create db:migrate db:seed

有没有预先构建的等效方法来做这件事?

从我所读的内容中,我认为rake db:reset并不完全是同样的东西,但我可能错了。


2
每次添加迁移时这样做有点过度了。只需要使用 db:migrate 命令就足够了。 - Andrew Marshall
没错,但我正在寻找一个通用的解决方案。这个项目有多个开发人员,每次我更新时,我只需重新创建数据库及其所有迁移、种子等。 - Catfish
此外,如果种子被更新了,我必须清除数据库,以免出现重复的种子。 - Catfish
也许你应该重写你的种子以使其成为幂等的。 - Andrew Marshall
我该怎么做?大多数人都是怎么做的? - Catfish
显示剩余4条评论
5个回答

7
您可以创建一个自定义的rake任务来完成这个功能 - lib/tasks/db_rebuild_all.rake
namespace :db_tasks do
  desc "Rebuild database"
  task :rebuild, [] => :environment do
    raise "Not allowed to run on production" if Rails.env.production?

    Rake::Task['db:drop'].execute
    Rake::Task['db:create'].execute
    Rake::Task['db:migrate'].execute
    Rake::Task['db:seed'].execute
  end
end

然后只需运行bundle exec rake db_tasks:rebuild


我想我可以这样做,但如果我要编写一个函数来完成这个任务,我会创建一个Unix别名,这样会更简单。 - Catfish
一个别名可以工作,但如果您将其添加到应用程序中,则所有开发人员都可以访问它;将来,您可以添加步骤从经过擦拭的生产备份生成您的数据库等... - house9

4
你可以运行 rake db:drop 然后运行 rake db:setupdb:setup 会运行 rake db:create db:schema:load 和 db:seed
但是为什么每次有新的迁移时都要删除并重新创建数据库呢?这就是迁移存在的原因,它可以对现有数据库进行增量更改。

但问题在于已经存在的种子现在被再次创建,因此我们有了重复项。 - Catfish
1
在已部署迁移后,不应更改现有的迁移。请添加新的迁移。 - catsby
我同意@ctshryock的观点。另外,如果您每次都要删除数据库,那么种子数据是如何复制的呢? - Zajn
他们不知道如果我删除数据库会发生什么。如果我不删除数据库,种子将会重复。 - Catfish
如果你的种子文件经常变化,我不确定是否有比在迁移运行后清除数据库并重新播种更简单的答案。 - Zajn
显示剩余3条评论

3
运行 rake db:reset && rake db:seed (注意:您必须更新 db/schema.rb 文件)
或者
运行 rake db:migrate:reset && rake db:seed

注意:rake db:migrate:reset 会从头开始重新运行所有迁移,而 db:reset 则根据 schema.rb 文件简单地重新生成数据库。 - BenKoshy

2

0

首先创建任务文件(lib/tasks/db.rake),内容如下:

rails g task db reseed

然后在其中写入:

namespace :db do
  desc "Reseed database task"
  task reseed: [ 'db:drop', 'db:create', 'db:migrate', 'db:seed' ] do
    puts 'Reseeding completed.'
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接