2010-03-23 54 views
5

Một quy trình đơn giản lưu trữ trong MySQL:Làm thế nào để gọi thủ tục lưu trữ MySQL từ Rails?

CREATE PROCEDURE `proc01`() 
BEGIN 
SELECT * FROM users; 
END 

Bắt đầu Rails console:

$ script/console 
Loading development environment (Rails 2.3.5) 
>> User.connection.execute("CALL proc01") 
=> #<Mysql::Result:0x10343efa0> 

Trông tốt. NHƯNG, bất kỳ cuộc gọi hơn với cùng một thủ tục lưu trữ thông qua kết nối hiện tại sẽ dẫn đến một Commands đồng bộ lỗi:

>> User.connection.execute("CALL proc01") 
ActiveRecord::StatementInvalid: Mysql::Error: Commands out of sync; you can't run this command now: CALL proc01 
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract_adapter.rb:219:in `log' 
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/mysql_adapter.rb:323:in `execute' 
    from (irb):2 

Các lỗi có thể được xóa bởi một "reload!" lệnh trong bảng điều khiển:

>> reload! 
Reloading... 
=> true 
>> User.connection.execute("CALL proc01") 
=> #<Mysql::Result:0x1033f14d0> 
>> 

Làm cách nào để gọi thủ tục lưu sẵn MySQL từ Rails?

+0

Tôi đăng một số thông tin tiếp theo tại: http://www.ruby-forum.com/topic/193977#899074 (do SO không hỗ trợ danh sách mã trong nhận xét) Có thể" kết nối! nếu! hoạt động? "có thể là một sửa chữa.Không chắc đó có phải là câu trả lời cho câu hỏi này hay không. – ohho

+0

Tóm tắt trong nhật ký web của tôi: http://ho.race.hk/blog/?p=231 – ohho

Trả lời

4

EDIT:

-

Sử dụng ActiveRecord::Base.connections.exec_query() được như xa như tôi có thể nói một cách tiếp cận NHIÊU tốt hơn chỉ vì nó trả về một mảng băm như người ta mong đợi, mà ActiveRecord::Base.connections.execute không làm.

Documentation

-

Vui lòng đọc các chỉnh sửa ở trên, tôi đang rời khỏi dưới đây để tham khảo.

Trong khi tôi nhận ra câu hỏi này khá cũ và vì liên kết ohho được đăng có 404'd, tôi đã gặp lỗi tương tự gần đây.

tôi đã có thể sửa chữa nó bằng cách làm như sau:

result = ActiveRecord::Base.connection.execute("call example_proc()") ActiveRecord::Base.clear_active_connections!

Một khi bạn đã xóa các kết nối, bạn có thể chạy bất cứ thắc mắc khác, nơi như trước đây nó đã có thể thất bại trong cố gắng để truy cập vào cơ sở dữ liệu thông qua đường ray hoặc một proc được lưu trữ khác.

http://apidock.com/rails/v3.2.13/ActiveRecord/Base/clear_active_connections%21/class

- EDIT:

Nó cũng đáng nói đến là ta không nên lưu trữ các kết nối ActiveRecord trong một biến theo bài leente về này link

"Đừng nhớ cache

Không lưu trữ kết nối trong một biến, bởi vì một chuỗi khác có thể cố gắng sử dụng nó khi nó đã được kiểm tra trở lại vào hồ bơi kết nối."

connection = ActiveRecord::Base.connection #WRONG 

threads = (1..100).map do 
Thread.new do 
begin 
    10.times do 
    connection.execute("SELECT SLEEP(1)") # WRONG 
    ActiveRecord::Base.connection.execute("SELECT SLEEP(1)") # CORRECT 
    end 
    puts "success" 
rescue => e 
    puts e.message 
    end 
    end 
end 

threads.each(&:join) 
Các vấn đề liên quan