db:reset后,Postgres函数不会保留

时间:2018-06-06 08:02:31

标签: ruby-on-rails postgresql activerecord

我创建了一个自定义postgres函数创建的迁移:

class CreatePopularityPgFunctions < ActiveRecord::Migration[5.2]
  def up
    execute %{
      CREATE OR REPLACE FUNCTION popularity(count integer, weight integer default 3) RETURNS integer AS $$
        SELECT count * weight
      $$ LANGUAGE SQL IMMUTABLE;
    }
  end

  def down
    execute 'drop function popularity(integer, integer) cascade'
  end
end

并正确运行rake db:migrate将其添加到架构中。但是,由于某种原因,运行rake db:reset似乎不会在PG中创建此功能。该函数不在架构中,并尝试在SQL查询中使用它,导致错误的函数丢失。

1 个答案:

答案 0 :(得分:3)

db:reset运行db:drop db:setup。在db:setup中创建数据库模式。但schema.rb无法处理自定义函数或视图。

来自文档:

  

db / schema.rb无法表达特定于数据库的项,例如外键约束,触发器或存储过程。在迁移中,您可以执行自定义SQL语句,但架构转储程序无法从数据库重新构建这些语句。如果您使用这样的功能,那么您应该将架构格式设置为:sql。

您可以改用structure.sql。使用structure.sql

  

这是通过config.active_record.schema_format设置在config / application.rb中设置的,它可以是:sql或:ruby。

更多详情here.