如果数据库已经存在,则依赖于 Rake 任务

Rake task dependent if database already exists

只是作为序言,我已经通读了 this question 和其他人,但没有答案真正提到在抽取任务中做到这一点的方法。

我想做一个看起来像这样的安装脚本:

  if database_exists?
    sh 'rake db:migrate'
  else
    sh 'rake db:setup'
  end

我还没有写 database_exists? 但是我怎么知道用户系统是否已经创建了这个数据库?

我不想每次都运行 rake db:setup,这会删除用户数据库。 我想我每次都可以运行 rake db:create && rake db:migrate,但是除了现在是 db:setup 进程的一部分的 rake 任务之外,用户还需要运行 rake db:seed

我的建议是使用 rails runner 或 rake 任务编写 ruby 到 运行 的脚本,您可以在其中定义 database_exists?方法如下:

def database_exists?
  ActiveRecord::Base.connection
rescue ActiveRecord::NoDatabaseError
  false
else
  true
end

文档