2009-08-04 26 views
7

Tôi phải tạo một di chuyển Rails để tạo ra nhiều trình kích hoạt và thủ tục lưu sẵn.Có thể sử dụng tệp SQL bên ngoài trong quá trình di chuyển Rails không?

Thông thường người ta sẽ làm điều đó bằng cách sử dụng phương pháp execute, nhưng vì kích thước của các câu lệnh, tôi muốn giữ chúng trong một tệp bên ngoài và tham chiếu nó từ di chuyển.

Tôi có thể làm như thế nào? Thậm chí có thể không?

Trả lời

10

Bạn chỉ có thể lưu trữ chúng trong một tệp văn bản và đọc chúng qua một đối tượng Tệp.

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

Rất xấu, nhưng hoạt động. Tôi khuyên bạn nên giữ các thủ tục/trình kích hoạt được lưu trữ bên trong di chuyển để dễ dàng khôi phục.

Nếu bạn làm "tập tin bên ngoài" phương pháp, bạn sẽ cần phải duy trì hai tập tin bổ sung mỗi di cư, một cho thêm tất cả các công cụ, và một cho thả trong trong trường hợp một:

rake db:rollback 
+2

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

2

Câu trả lời của Mike hoạt động không có vấn đề gì nếu bạn chỉ có một câu lệnh trong tệp, nhưng nếu có nhiều câu lệnh hơn (nhiều chèn và cập nhật), ActiveRecord sẽ thất bại vì nó không hỗ trợ nhiều câu lệnh với một cuộc gọi theo mặc định.

Một giải pháp là sửa đổi ActiveRecord để hỗ trợ nhiều câu lệnh, như được hướng dẫn here.

giải pháp khác sẽ được đảm bảo rằng tập tin SQL của bạn chỉ chứa một tuyên bố cho mỗi hàng và sử dụng một vòng lặp như

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

tôi đã làm như sau nơi chúng tôi cần: Cơ sở

class RawSqlMigration < ActiveRecord::Migration 
    def up 
    execute File.read(File.expand_path('../../sql_migrations/file.sql', __FILE__)) 
    end 
end 
Các vấn đề liên quan