10

私は、Ruby on Rails、DB(MS) ドライバー、およびストアド プロシージャの間の長年にわたる愛憎関係に精通しており、バージョン 2.3.2 から Rails アプリケーションを開発しています。

ただし、時々、(はるかに遅い) アプリケーション レベルでデータを結合するよりも SP の方が適しているという状況が発生します。特に、複数のテーブルのデータを組み合わせたレポートの実行は、通常、SP に適しています。

ストアド プロシージャがまだ Rails や MySQL gem に十分に統合されていないのはなぜですか。私は現在、Rails 3.0.10 と MySQL2 gem 0.2.13 を使用したプロジェクトに取り組んでいますが、私が見る限り、最新の Edge Rails と MySQL gem 0.3+ でさえ、SP を使用すると癇癪を起こします。

SP が呼び出された後にデータベース接続が失われるという問題は、これまでも今も続いています。

>> ActiveRecord::Base.connection.execute("CALL stored_proc")
=> #<Mysql::Result:0x103429c90>
>> ActiveRecord::Base.connection.execute("CALL stored_proc")
ActiveRecord::StatementInvalid: Mysql::Error: Commands out of sync; 
[...]
>> ActiveRecord::Base.connection.active?
=> false
>> ActiveRecord::Base.connection.reconnect!
=> nil
>> ActiveRecord::Base.connection.execute("CALL proc01")
=> #<Mysql::Result:0x1034102e0>
>> ActiveRecord::Base.connection.active?
=> false

これは技術的に取り組むのが本当に難しい問題ですか、それとも Rails による設計上の選択ですか?

4

3 に答える 3

10

ストアド プロシージャはレールでサポートされています。MULTI_STATEMENTSRails では MySQL のフラグがデフォルトで有効になっていないため、非同期エラーが発生しています。このフラグにより​​、プロシージャーは複数の結果セットを返すことができます。

有効にする方法のコード サンプルについては、こちらを参照してください: https://gist.github.com/wok/1367987

ストアド プロシージャは、MS SQL Server ですぐに使用できます。

私はほとんどすべての mySQL および SQL Server ベースの Rails プロジェクトでストアド プロシージャを使用しており、何も発行していません。

于 2013-02-25T09:17:06.953 に答える
3

これは、postgres が MyClass のインスタンスを返すストアド プロシージャを実行するためのものです。

sql=<<-SQL
select * from my_cool_sp_with_3_parameters(?, ?, ?) as 
foo(
  column_1 <type1>,
  column_2 <type2>
)
SQL

MyClass.find_by_sql([sql, param1, param2, param3]);

foo() 内の列リストをモデルの列とストアド プロシージャの結果に置き換えます。クラスの列を調べることで、これを汎用的にできると確信しています。

于 2012-07-27T17:13:42.793 に答える