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

How to check if the database exists or not in rails before doing a rake db:setup

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

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


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

1
2
3
4
5
6
7
def database_exists?
  ActiveRecord::Base.connection
rescue ActiveRecord::NoDatabaseError
  false
else
  true
end

工具书类

  • 活动记录::base.connection
  • ActiveRecord::节点数据库错误


我做了一个rake任务,扩展了前面的一些答案。我在vagrant+docker设置中经常使用这个命令,所以我可以非常容易地发出一个命令,创建一个新数据库或发出迁移到当前数据库。我使用分支数据库范式进行开发。我经常需要建立一个新的数据库或者更新我现有的数据库。

在lib/tasks/db_exists.rake中:

1
2
3
4
5
6
7
8
9
10
11
12
13
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

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

1
rake db:exists && rake db:migrate || rake db:setup

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

1
2
3
.PHONY database
database:
        rake db:exists && rake db:migrate || rake db:setup

转化为:

1
make database

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


如果数据库还不存在,您还可以指望rake db:migrate返回一个错误。

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

1
rake db:migrate 2>/dev/null || rake db:setup

(受企鹅编码器的启发)


下面是我为这个目的编写的一些bash脚本:

后格雷斯

1
2
3
4
5
6
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

MySQL

1
2
3
4
5
6
 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

这些检查是否存在schema_migrations表,以确定rake db:setup以前是否运行过。


如果数据库不存在或连接未处于活动状态(至少在Rails 4+中),则返回false。

1
::ActiveRecord::Base.connection_pool.with_connection(&:active?) rescue false

试试这个

1
2
3
4
5
6
7
8
9
10
11
12
13
 IF EXISTS
       (
         SELECT name FROM master.dbo.sysdatabases
        WHERE name = N'New_Database'
        )
    BEGIN
        SELECT 'Database Name already Exist' AS Message
    END
    ELSE
    BEGIN
        CREATE DATABASE [New_Database]
        SELECT 'New Database is Created'
    END