Создать последовательность в миграции, не отраженную в схеме - PullRequest
7 голосов
/ 05 февраля 2012

У меня есть приложение, которое требует наличия последовательности в базе данных.У меня есть миграция, которая делает следующее:

class CreateSequence < ActiveRecord::Migration
  def self.up
    execute "CREATE SEQUENCE sequence"
  end

  def self.down
    execute "DROP SEQUENCE sequence"
  end
end

Это не меняет schema.rb и, следовательно, ломает rake db:setup.Как заставить схему включить последовательность?

Примечание. Последовательность существует после выполнения rake db:migrate.

Ответы [ 3 ]

7 голосов
/ 31 марта 2012

Rails Миграции, потому что они направлены на схему таблиц и полей, а не на полное представление базы данных, включая хранимые процедуры, функции, начальные данные.

Когда вы запускаете rake db: setup, это создаст базу данныхзагрузите схему, а затем загрузите начальные данные.

Несколько решений для рассмотрения:

Вариант 1: создайте собственную задачу rake, которая выполняет эти миграции независимо от Rails Migration up /вниз.Rails Migrations - это просто обычные классы, и вы можете использовать их по своему усмотрению.Например:

rake db:create_sequence

Вариант 2: запустить конкретную миграцию после загрузки схемы следующим образом:

rake db:setup
rake db:migrate:up VERSION=20080906120000

Вариант 3: создать свою последовательность в качестве начальных данных, поскольку она по сути обеспечиваетданные (вместо того, чтобы изменять схему).

db/seeds.rb

Вариант 4 и мои личные предпочтения: выполнить миграцию до известного хорошего момента, включая вашу последовательность, и сохранить эту пустую базу данных.Измените rake db: setup, чтобы клонировать эту пустую базу данных.Это немного сложнее и жертвует некоторыми возможностями - все миграции должны быть обратимыми, миграция работает на базе нескольких поставщиков баз данных и т. Д. По моему опыту, это хороший компромисс.Например:

rake db:fresh  #=> clones the blank database, which you store in version control
2 голосов
/ 02 августа 2012

Все вышеперечисленные предложения хороши. Тем не менее, я думаю, что нашел лучшее решение. в основном в твоей разработке.рб поставь

    config.active_record.schema_format = :sql 

Для получения дополнительной информации см. Мой ответ на этот вопрос - тест rake не копирует развитие postgres db с последовательностями

0 голосов
/ 09 февраля 2013

Посмотрите на камень pg_sequencer .Он управляет последовательностями Pg для вас, как вы хотите.Единственный недостаток, который я вижу сейчас, заключается в том, что он плохо работает с db/schema.rb - Rails сгенерирует CREATE SEQUENCE для ваших столов с полем serial, а pg_sequencer будет также генерирует саму последовательность.(Работаю, чтобы это исправить.)

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