如何在执行rake db:setup之前检查rails中是否存在数据库

Bea*_*ude 19 ruby-on-rails ruby-on-rails-3

如何在执行rake db:setup之前检查数据库是否存在于rails中?

我想在db:create完成之前检查数据库是否已经存在.到目前为止,我还没有在rails中看到过具体的方法,但我知道这可以使用mysql脚本完成

Dwa*_*oks 21

这是一个检查数据库是否已存在的方法:

def database_exists?
  ActiveRecord::Base.connection
rescue ActiveRecord::NoDatabaseError
  false
else
  true
end
Run Code Online (Sandbox Code Playgroud)

参考


pen*_*der 21

我做了一个rake任务,扩展了之前的一些答案.我在Vagrant + Docker设置中经常使用它,因此我可以非常轻松地发出单个命令并创建新数据库或发布到当前数据库的迁移.我使用分支数据库范例进行开发.我经常需要播种新数据库或更新现有数据库.

在lib/tasks/db_exists.rake中:

namespace :db do
  desc "Checks to see if the database exists"
  task :exists do
    begin
      Rake::Task['environment'].invoke
      ActiveRecord::Base.connection
    rescue
      exit 1
    else
      exit 0
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

所以现在我可以运行一个简单的bash命令:

rake db:exists && rake db:migrate || rake db:setup
Run Code Online (Sandbox Code Playgroud)

然后我将其进一步自动化为Makefile(为简洁而修剪):

.PHONY database
database:
        rake db:exists && rake db:migrate || rake db:setup
Run Code Online (Sandbox Code Playgroud)

翻译成:

make database
Run Code Online (Sandbox Code Playgroud)

满足我所有的本地数据库需求.

  • 而不是`Rake :: Task ['environment'].invoke`,你可以做`task:exists =>:environment`吗? (3认同)
  • 不,因为我不希望先决任务的执行在我有机会捕获错误并静默返回之前失败。此任务的目的是查看它是否有效,然后默默地返回 0/1 状态,并且您必须将对环境任务的调用包装在开始/救援块中,以便检查通过/失败状态而不是获取一个充满回溯的巨大屏幕。 (3认同)

ber*_*ghe 11

rake db:migrate如果数据库尚不存在,您还可以依赖于返回错误的事实.

我在我的脚本中使用了类似的东西:

rake db:migrate 2>/dev/null || rake db:setup
Run Code Online (Sandbox Code Playgroud)

(灵感来自penguincoder)

  • 我强烈建议不要这样做。如果您的 db:migrate 命令因任何原因失败,则运行安装命令。db:setup 将截断任何现有错误,因此如果您的迁移因任何原因失败,您将丢失所有数据, (3认同)

nat*_*nes 11

Rails 6 现在有一个rails db:prepare任务。

db:prepare会跑db:migrate。如果db:migrate失败,则运行db:create、 、db:seed,然后db:migrate运行。

查看所有 Rails 任务rails --tasks

...
rails db:exists                             # Checks to see if the database exists
...
rails db:prepare                            # Runs setup if database does not exist, or runs migrations if it does
...
rails db:setup                              # Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)
...

Run Code Online (Sandbox Code Playgroud)

注意: db:setup将删除数据库中当前的所有数据。请参阅约书亚品特斯的 评论


Cam*_*tin 8

下面是我对为此作出了一些的bash脚本:

Postgres的

if echo "\c $PGDATABASE; \dt" | psql | grep schema_migrations 2>&1 >/dev/null
then
   bundle exec rake db:migrate
else
   bundle exec rake db:setup
fi
Run Code Online (Sandbox Code Playgroud)

Mysql的

 if echo "use $MYSQLDATABASE; show tables" | mysql | grep schema_migrations 2>&1 > /dev/null
 then
     bundle exec rake db:migrate
 else
     bundle exec rake db:setup
 fi
Run Code Online (Sandbox Code Playgroud)

这些检查对存在schema_migrations表来确定是否rake db:setup以前已运行.


aru*_*noc 5

如果数据库不存在或连接不活动(至少在 Rails 4+ 中),这将返回 false。

::ActiveRecord::Base.connection_pool.with_connection(&:active?) rescue false
Run Code Online (Sandbox Code Playgroud)