31

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

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

4

8 回答 8

29

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

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

参考

于 2014-08-31T13:43:22.303 回答
26

我做了一个 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

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

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

然后我将其进一步自动化为 Makefile(为简洁起见):

.PHONY database
database:
        rake db:exists && rake db:migrate || rake db:setup

翻译成:

make database

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

于 2016-03-01T20:19:50.190 回答
17

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

我在我的脚本中使用了这样的东西:

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

(灵感来自 [penguincoder]

请注意,这仅在表达式的退出代码很重要(考虑任何类型的管道)之类的原始问题问题(请参阅问题本身下方作者的附加评论)之类的情况下有用:在大多数情况下,rake db:setup将完全执行与 相同rake db:migrate 2>/dev/null || rake db:setup,但退出代码除外。

于 2016-10-13T11:19:09.660 回答
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

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

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

于 2014-04-15T04:46:26.897 回答
5

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

::ActiveRecord::Base.connection_pool.with_connection(&:active?) rescue false
于 2018-12-03T18:53:50.800 回答
4

Rails 6 now has a rails db:prepare task.

db:prepare will run db:migrate. If db:migrate fails, then db:create, db:seed, followed by db:migrate are run.

See all rails tasks with 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)
...

NOTE: db:setup will remove any data currently in the database. See Joshua Pinters's comment.

于 2021-03-11T22:31:19.990 回答
0

这是我用来检查数据库状态的内容:

if db_version=$(bundle exec rake db:version 2>/dev/null)
then
    if [ "$db_version" = "Current version: 0" ]; then
        echo "DB is empty"
    else
        echo "DB exists"
    fi
else
    echo "DB does not exist"
fi
于 2019-11-26T08:52:55.530 回答
0

尝试这个

 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
于 2018-05-09T09:56:54.333 回答