在 Rails 5.0.1 / PostgreSQL 中增强数据库任务

Eenhancing database tasks in Rails 5.0.1 / PostgreSQL

我们正在使用自定义任务增强 db:createdb:test:purge 任务以创建架构并启用 postgisuuid-ossphstore 扩展,如下所示.

# 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