我创建了一个自定义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查询中使用它,导致错误的函数丢失。
答案 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.