在 Rails 5.0.1 / PostgreSQL 中增强数据库任务
Eenhancing database tasks in Rails 5.0.1 / PostgreSQL
我们正在使用自定义任务增强 db:create
和 db:test:purge
任务以创建架构并启用 postgis
、uuid-ossp
和 hstore
扩展,如下所示.
# lib/tasks/db_enhancements.rake
#
namespace :db do
desc 'create shared_extensions Schema'
task :extensions => :environment do
# Create Schema
ActiveRecord::Base.connection.execute 'CREATE SCHEMA IF NOT EXISTS shared_extensions;'
# Enable Hstore
ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS HSTORE SCHEMA shared_extensions;'
# Enable UUID-OSSP
ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp" SCHEMA shared_extensions;'
# Enable Postgis
# Drop the postgis extension first
ActiveRecord::Base.connection.execute 'DROP EXTENSION "postgis"';
# Create postgis in shared_extensions
ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS "postgis" SCHEMA shared_extensions;'
end
end
Rake::Task["db:create"].enhance do
Rake::Task["db:extensions"].invoke
end
Rake::Task["db:test:purge"].enhance do
Rake::Task["db:extensions"].invoke
end
上述任务在 Rails 4.2.5
中运行良好
rails db:create
任务应调用自定义任务,后者又应创建 shared_extensions
模式并启用扩展,如下所示。
test_application_test=# \dx
List of installed extensions
Name | Version | Schema | Description
-----------+---------+-------------------+---------------------------------------------------------------------
hstore | 1.3 | shared_extensions | data type for storing sets of (key, value) pairs
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
postgis | 2.2.1 | shared_extensions | PostGIS geometry, geography, and raster spatial types and functions
uuid-ossp | 1.0 | shared_extensions | generate universally unique identifiers (UUIDs)
在Rails 5.0.1 ----
当 rails db:create
为 运行 时,db:extensions
任务会在开发数据库中创建 shared_extensions
模式,但不会在测试数据库中创建。另一方面,如果 rails db:create RAILS_ENV=test
在 运行 宁 rails db:create
之前是 运行,则会为测试数据库创建 shared_extensions
模式。
如上所述,自定义任务在 Rails 4.2.5
中运行良好
似乎 rails db:create
正常工作。我在 GitHub rails/rails 问题上创建了一个问题。 @rafaelfranca 阐明了 Rails 4.2 db:test:purge
是在 db:create
而不是 Rails 5.0.
中调用的
目前,这是命令行上的解决方法。
bin/rails db:environment:set RAILS_ENV=development
bin/rails db:drop
bin/rails db:create RAILS_ENV=test
bin/rails db:create
bin/rails db:migrate RAILS_ENV=test
bin/rails db:migrate
我们正在使用自定义任务增强 db:create
和 db:test:purge
任务以创建架构并启用 postgis
、uuid-ossp
和 hstore
扩展,如下所示.
# lib/tasks/db_enhancements.rake
#
namespace :db do
desc 'create shared_extensions Schema'
task :extensions => :environment do
# Create Schema
ActiveRecord::Base.connection.execute 'CREATE SCHEMA IF NOT EXISTS shared_extensions;'
# Enable Hstore
ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS HSTORE SCHEMA shared_extensions;'
# Enable UUID-OSSP
ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp" SCHEMA shared_extensions;'
# Enable Postgis
# Drop the postgis extension first
ActiveRecord::Base.connection.execute 'DROP EXTENSION "postgis"';
# Create postgis in shared_extensions
ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS "postgis" SCHEMA shared_extensions;'
end
end
Rake::Task["db:create"].enhance do
Rake::Task["db:extensions"].invoke
end
Rake::Task["db:test:purge"].enhance do
Rake::Task["db:extensions"].invoke
end
上述任务在 Rails 4.2.5
中运行良好rails db:create
任务应调用自定义任务,后者又应创建 shared_extensions
模式并启用扩展,如下所示。
test_application_test=# \dx
List of installed extensions
Name | Version | Schema | Description
-----------+---------+-------------------+---------------------------------------------------------------------
hstore | 1.3 | shared_extensions | data type for storing sets of (key, value) pairs
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
postgis | 2.2.1 | shared_extensions | PostGIS geometry, geography, and raster spatial types and functions
uuid-ossp | 1.0 | shared_extensions | generate universally unique identifiers (UUIDs)
在Rails 5.0.1 ----
当 rails db:create
为 运行 时,db:extensions
任务会在开发数据库中创建 shared_extensions
模式,但不会在测试数据库中创建。另一方面,如果 rails db:create RAILS_ENV=test
在 运行 宁 rails db:create
之前是 运行,则会为测试数据库创建 shared_extensions
模式。
如上所述,自定义任务在 Rails 4.2.5
中运行良好似乎 rails db:create
正常工作。我在 GitHub rails/rails 问题上创建了一个问题。 @rafaelfranca 阐明了 Rails 4.2 db:test:purge
是在 db:create
而不是 Rails 5.0.
目前,这是命令行上的解决方法。
bin/rails db:environment:set RAILS_ENV=development
bin/rails db:drop
bin/rails db:create RAILS_ENV=test
bin/rails db:create
bin/rails db:migrate RAILS_ENV=test
bin/rails db:migrate