2012-09-06 49 views
0

在Ruby中,我有一個測試,它是ActiveSupport::TestCase的一個子類,並通過Postgres(實際上是Greenplum)數據庫中的ActiveRecord子類訪問表。對於一個特定的測試,我需要填充大約一百萬行的表格,但我並不在乎它裏面的內容。我可以做類似爲ActiveRecord測試創建數百萬條記錄

for i in 1...1000000 do 
    MyTable.create(:column1 => 'value', :column2 => 'value') 
end 

但這需要很長時間才能運行。我可以通過在交易中包裝它使其更快一點,以便create不會每次創建一個新的,但這隻會節省很多時間。

有沒有一些很好的方法來做到這一點,以便我不必在表格中執行大量僞造值的插入操作? (注意:爲了試圖僞裝表中包含一百萬條記錄而不知情的事情,因爲我後來需要與實際行進行交互;對於這個特定的測試,我只是不在乎它們是什麼)

+0

如果你可以放入原始SQL,你可以使用這個:http://www.postgresql.org/docs/9.0/static/plpgsql-control-structures.html#PLPGSQL-INTEGER-FOR –

+0

使用'for'是反模式。它只是調用'each',所以它更有意義(並且遵循OO模式)來做'(1 ... 1000000)。每個都...結束'。或者甚至更好,只是「1000000次......做......結束」。 –

回答

3

運行都在一個簡單的查詢,如:

INSERT INTO mytable (col1, col2) 
SELECT 'value1', 'value2' 
FROM generate_series(1,1000000); 

這應該蠻快的填充數據庫。我的筆記本電腦需要2秒鐘。

+1

['generate_series']的Hooray(http://www.postgresql.org/docs/current/static/functions-srf.html#FUNCTIONS-SRF-SERIES)!這是一個非常有用的PostgreSQL功能。 –