2012-12-13 41 views
1

在我們的PostgreSQL支持Rails項目,用叉勺運行RSpec的時候,有時我們收到以下錯誤:RSpec的,叉勺和Postgres的錯誤:準備好的語句「A1」已經存在

ActiveRecord::StatementInvalid: 
    PG::Error: ERROR: prepared statement "a1" already exists 

最初,它只是發生一天幾次,但最近,它已經開始每3-4次測試運行一次,這會減緩我們的開發工作。

有沒有辦法重置/刪除PostgreSQL的預處理語句裏面我們spec_helper.rb文件的地方嗎?

回答

1

搜索PostgreSQL docs並在不同地點測試它的spec_helper.rb內相當數量的反覆試驗後,我終於想通了,我可以添加以下命令來刪除現有的所有準備好的發言,我還沒有,因爲看到的錯誤:

RSpec.configure do |config| 
    # ... other code 

    config.after(:suite) do 
    ActiveRecord::Base.connection.execute("DEALLOCATE ALL") 
    end 

    # ... other code 
end 
+2

這似乎有點像被隱藏真正的問題一個雜牌的。有些東西本身並沒有清理乾淨,假設一旦數據庫連接關閉,一切都會好起來。你正在爲測試套件添加一個kludge來隱藏一個錯誤,這有點不妥。 –

+0

@ muistooshort我很樂意聽到任何建議,但由於我們實際上並沒有使用預先準備的語句,所以我不知道自己沒有正確地清理它們。我假設這是Rails內部的東西,它爲性能目的創建了準備好的語句。 –

+0

你正在使用哪些數據庫庫?只是簡單的ActiveRecord? –

1

你可以得到這個,如果你正在做的事情,如:

class ActiveRecord::Base 
    mattr_accessor :shared_connection 
    @@shared_connection = nil 
    def self.connection 
     @@shared_connection || retrieve_connection 
    end 
    end 
    ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection 

(這是推薦here)。

如果您有或類似的,請嘗試刪除它。

+0

我不這樣做。我在某個時候嘗試過,但永遠無法讓我們的JavaScript規範正常工作。 –

相關問題