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

oxiaedzo  于 2023-03-04  发布在  Ruby
关注(0)|答案(9)|浏览(309)

如何在rake db:setup之前检查数据库是否存在于rails中?
我想在执行db:create之前检查一个数据库是否已经存在,到目前为止我还没有在rails中看到具体的方法,但是我知道可以使用mysql脚本来完成

64jmpszr

64jmpszr1#

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

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

参考资料

gg58donl

gg58donl2#

我做了一个rake任务,扩展了前面的一些答案。我在Vagrant+Docker设置中经常使用这个任务,所以我可以非常容易地发出一个命令,创建一个新数据库或发出一个迁移到当前数据库的命令。我使用branched database范式进行开发。我经常需要播种一个新数据库或更新现有数据库。
在库/任务/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

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

ttp71kqs

ttp71kqs3#

如果数据库尚不存在,rake db:migrate:status也会返回错误,这一点您也可以放心。
我在我的脚本中使用了类似这样的内容:

(rake db:migrate:status 2>/dev/null || rake db:setup) && rake db:migrate

(灵感来自[penguincoder]

ffx8fchx

ffx8fchx4#

Rails 6现在有了一个rails db:prepare任务。
db:prepare将运行db:migrate。如果db:migrate失败,则依次运行db:createdb:seeddb:migrate
使用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)
...

注意:db:setup将删除数据库中当前的所有数据。请参阅Joshua Pinters's注解。

kiz8lqtg

kiz8lqtg5#

下面是我为此编写的一些bash脚本:

波斯格雷斯

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

我的名字

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以前是否运行过。

ffdz8vbo

ffdz8vbo6#

如果DB不存在或者连接不活跃(至少在Rails4+中),这将返回false。

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

nkhmeac67#

"试试这个"

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
vmdwslir

vmdwslir8#

下面是我用来检查DB状态的代码:

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
brjng4g3

brjng4g39#

我的bash版本:

database_version() {
    local DB_VERSION=$(bundle exec rake db:version 2>/dev/null)

    if [[ "$DB_VERSION" =~ ^Current\ version\:\ ([[:digit:]]+)$ ]]; then
        if [[ "${BASH_REMATCH[1]}" != "" ]]; then
            echo $(("${BASH_REMATCH[1]}"))
        else
            echo -1
        fi
        return
    fi

    echo -1
}

if [[ $(($(database_version))) > 0 ]]; then
    echo "Database exists"
else
    echo "Database does not exist"
fi

相关问题