Можно ли использовать внешний файл SQL в миграции Rails? - PullRequest
7 голосов
/ 04 августа 2009

Я должен создать миграцию Rails, которая создает много триггеров и хранимых процедур.

Обычно это можно сделать, используя метод execute, но из-за размера операторов я бы предпочел сохранить их во внешнем файле и ссылаться на них из миграции.

Как я могу это сделать? Это вообще возможно?

Ответы [ 3 ]

10 голосов
/ 04 августа 2009

Вы можете просто сохранить их в текстовом файле и прочитать их через объект File.

sql = ""
source = File.new("./sql/procedures.sql", "r")
while (line = source.gets)
  sql << line
end
source.close
execute sql

Это некрасиво, но работает. Я настоятельно рекомендую хранить хранимые процедуры / триггеры внутри миграций для упрощения отката.

Если вы используете метод "external file", вам нужно будет поддерживать два дополнительных файла на миграцию, один для добавления всего материала и один для добавления в случае:

rake db:rollback
2 голосов
/ 16 июня 2015

Я сделал следующее, где нам было нужно:

class RawSqlMigration < ActiveRecord::Migration
  def up
    execute File.read(File.expand_path('../../sql_migrations/file.sql', __FILE__))
  end
end
2 голосов
/ 12 ноября 2013

Ответ Майка работает без проблем, если у вас есть только один оператор в файле, но если есть больше операторов (например, несколько вставок и обновлений), ActiveRecord завершится ошибкой, так как по умолчанию не поддерживает несколько операторов с одним вызовом .

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

Другое решение состояло бы в том, чтобы ваш файл SQL содержал только одну инструкцию на строку и использовал цикл, подобный

source = File.open "db/foo.sql", "r"
source.readlines.each do |line|
  line.strip!
  next if line.empty? # ensure that rows that contains newlines and nothing else does not get processed
  execute line
end
source.close
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...