Функции Postgres не сохраняются после db: reset - PullRequest
0 голосов
/ 06 июня 2018

Я создал миграцию с созданием пользовательской функции 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 голосов
/ 06 июня 2018

db:reset работает db:drop db:setupdb:setup создается схема базы данных.Но schema.rb не обрабатывает пользовательские функции или представления.

Из документации:

db / schema.rb не может выражать специфичные для базы данных элементы, такие как ограничения внешнего ключа, триггеры,или хранимые процедуры.Хотя в процессе миграции вы можете выполнять пользовательские операторы SQL, дампер схемы не может восстановить эти операторы из базы данных.Если вы используете такие функции, как этот, вы должны установить формат схемы: sql.

Вместо этого вы можете использовать structure.sql.Для использования structure.sql:

Это задается в config / application.rb параметром config.active_record.schema_format, который может быть либо: sql, либо: ruby.

Подробнее здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...