2012-05-03 25 views
7

使用Sequel可以在單個呼叫中進行多次更新嗎?例如,在我的服務器上進行大約200次更新可能需要幾分鐘的時間,但是如果我僞造一個SQL查詢,它將在幾秒鐘內運行。我想知道Sequel是否可以用來僞造這個SQL查詢,甚至更好,整個操作本身就是一個鏡頭。是否有可能在Sequel中批量更新?

+1

是的,但它取決於你試圖做什麼,以及什麼RDBMS你正在運行的。請提供更多信息,以便我們能夠更好地爲您提供建議。 –

+0

我正在使用PostgreSQL,並且我希望Sequel針對多個更新發出單個查詢,因爲我可以在普通SQL中執行此查詢。 – RooSoft

回答

3

我遇到的解決方案涉及update_sql方法。它不是執行操作本身,而是輸出原始SQL查詢。要批量多個更新,只需將它們加入;在兩者之間,使用結果字符串調用run方法,並且全部設置完成。

批處理解決方案比多個更新更快。

+1

這個解決方案只比'多個更新'更快,因爲你只爲整個更新集合建立一個實際的連接/訪問數據庫,而不是每個更新。請注意,有些框架會自動執行這種行爲 - 它們會在內存中保存更新,直到事務提交。此外,如果可以將多個語句重新寫入_one_語句,您可能會獲得更大的收益。 –

+2

這可能適用於您的情況,但並非所有Sequel適配器都支持Database#run中的多個查詢。續集實際上並沒有提供一個獨立於適配器的方法,它接受單個字符串中的多個查詢(一些適配器可以處理這樣的字符串,而另一些則不能)。 –

+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]]) 
相關問題