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 |
满足我所有的本地数据库需求。
如果数据库还不存在,您还可以指望
我在脚本中使用了类似的东西:
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 |
这些检查是否存在
如果数据库不存在或连接未处于活动状态(至少在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 |