2

MySQL DB と MySQL2 をアダプターとして使用します。

Rails でカスタム SQL ステートメントを実行したいと考えています。

次のように、PHP のように SQL ステートメントを準備できるメソッドが必要です。

stmt = prepare("INSERT INTO tab (col1, col2) VALUES (?, ?)", ["foo", "bar"])

しかし、ActiveRecord も MySQL2 もそのようなメソッドを持っていないことがわかりました。

しかし、 ActiveRecord::ConnectionAdapters::AbstractAdapterexec_*にはいくつかのメソッドがあることがわかりました。それらはまさに私のタスクに適していると思いますが、使用方法がわかりません。API ドキュメントにはほとんど情報がありません。

exec_insert(sql, name, binds)

バインドの代替としてバインドを使用して、この接続のコンテキストで insert sql ステートメントを実行します。name は、実行された sql ステートメントと共にログに記録されます。

これ疲れた

sql = "INSERT INTO tab (col1, col2) VALUES (?, ?)"
r = ActiveRecord::Base.connection().exec_insert(sql, "someName", [10, "foo"])
puts r

しかし、エラーが発生しました:

`query': Mysql2::Error: You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right syntax to use near '?, ?)'

では、これらのメソッドをどのように使用するのでしょうか? name属性とは bindパラメータの型とは sql-statement の書き方、代わりに何を入れ?ますか?

更新:

prepareRailsで使用するメソッドを書きました。github で参照してください

4

2 に答える 2

-1

exec_insert の使用はお勧めしません。これは「内部」メソッドであり、将来変更される可能性が非常に高いためです。

Rails のアプローチは次のとおりです。AR グッズを使用する (つまり、SQL をバイパスする) か、単純な SQL を使用します。この 2 つを混在させることは実用的なオプションではありません。

バインディング (exec_inser の 3 番目のパラメーター) は優れたツールであり、DB 列に対して DB に渡す値を動的にチェックできますが、それらを使用することは想定されていないため、その使用法は文書化されていません。

1) SQL クエリを手動で作成する

sql = "INSERT INTO tab (col1, col2) VALUES (10, 'foo')"

2)DBに発射する

r = ActiveRecord::Base.connection.execute(sql)

3) 結果を確認します。これは DB アダプタ固有です。

乾杯、

PS を忘れずcreated_atupdated_at columnsに設定して'DateTime.now'ください。

于 2013-04-20T22:02:29.217 に答える