2012-05-03 4 views
7

Sequelを使用して1回の通話で多数の更新を行うことはできますか?Sequelでバッチ更新が可能ですか?

たとえば、約200回の更新をサーバーで実行するには数分かかることがありますが、1回のSQLクエリを偽造すると数秒で実行されます。 Sequelを使用してSQLクエリを作成することができますか?

+1

はい、それはあなたがしようとしている、と何RDBMSあなたが実行している正確に何に依存します。私たちがより良いアドバイスをするために、より多くの情報を提供してください。 –

+0

私はPostgreSQLを使用しています。私はSequelでプレーンSQLで実行できるので、複数のアップデートに対して1つのクエリを発行します。 – RooSoft

答えて

3

私が見つけた解決策には、update_sqlメソッドがあります。操作自体を行う代わりに、生のSQLクエリを出力します。複数の更新をバッチするには、これらを単に結合してください。その間に、結果の文字列でrunメソッドを呼び出すと、すべて設定されます。

バッチ処理の方が、複数の更新よりも高速です。

+1

このソリューションは、複数の更新プログラムよりも高速です。これは、1回の更新ではなく、一連の更新プログラムのデータベースへの実際の接続/トリップを1回だけ行うという点です。一部のフレームワークでは、この種の動作が自動的に実行されます。トランザクションがコミットされるまでメモリ内の更新を保持します。また、_one_ステートメントに複数のステートメントを書き直すことができれば、さらに大きなメリットを得ることができます。 –

+2

あなたのケースではうまくいくかもしれませんが、すべてのSequelアダプターがDatabase#runで複数の照会をサポートするわけではありません。 Sequelは、実際には、単一の文字列で複数のクエリを受け付けるアダプタに依存しないメソッドを提供していません(一部のアダプタはこのような文字列で動作しますが、他のアダプタでは動作しません)。 –

+1

mysql2ドライバの場合、接続時にオプションとして{flags::: Mysql2 :: Client :: MULTI_STATEMENTS}を使用する必要があります – tothemario

5

あなたはDatset#importhttp://sequel.jeremyevans.net/rdoc/classes/Sequel/Dataset.html#method-i-import を使用することができますが、「関連付けられたテーブルに複数のレコードを挿入します。このメソッドは、データベースがサポートしている場合、効率的、単一のクエリ内のテーブルに多数のレコードを挿入するために使用することができます。挿入が自動的に包まれていますトランザクション。ここ

はそれを使用する方法の例です:

DB = Sequel.connect(...) 
DB[:movies].import([:id, :director, :title, :year], [[1, "Orson Welles", "Citizen Kane", 1941],[2, "Robert Wiene", "Cabinet of Dr. Caligari, The", 1920]]) 
関連する問題