2009-08-04 1 views
7

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

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

Как я могу это сделать? Возможно ли это?

ответ

10

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

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

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

Если вы делаете метод «внешний файл», вам необходимо поддерживать два дополнительные файлы в миграцию, один для добавления всех вещей, и один для сбрасывания в в случае:

rake db:rollback 
+2

ActiveRecord :: Base .establish_connection ActiveRecord :: Base.connection.execute (sql) – drhenner

2

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

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

Другое решение было бы убедиться, что ваш файл 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 
2

я сделал следующее, где нам нужно:

class RawSqlMigration < ActiveRecord::Migration 
    def up 
    execute File.read(File.expand_path('../../sql_migrations/file.sql', __FILE__)) 
    end 
end