2009-08-04 12 views

risposta

10

È possibile archiviarli in un file di testo e leggerli tramite un oggetto File.

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

È brutto, ma funziona. Consiglio vivamente di mantenere le stored procedure/i trigger all'interno delle migrazioni per semplificare i rollback.

Se fate il metodo "file esterno", è necessario mantenere due file aggiuntivi per la migrazione, uno per l'aggiunta di tutte le cose, e uno per far cadere in in caso di:

rake db:rollback 
+2

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

2

La risposta di Mike funziona senza problemi se nel file è presente una sola istruzione, ma se sono presenti più istruzioni (più inserimenti e aggiornamenti, ad esempio), ActiveRecord avrà esito negativo poiché non supporta più istruzioni con una chiamata per impostazione predefinita.

Una soluzione potrebbe essere quella di modificare ActiveRecord per supportare più istruzioni, come indicato here.

Altro soluzione sarebbe quella di assicurarsi che il file SQL contiene una sola istruzione per riga e utilizzare un ciclo come

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

ho fatto la seguente dove abbiamo bisogno:

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