2011-08-25 79 views
2

不知道爲什麼我在我的日誌中得到這個錯誤。這種錯誤經常發生,但不一致,我不知道爲什麼。這裏是我的代碼:Sinatra,DataMapper:沒有這樣的表錯誤

require 'rubygems' 
require 'sinatra' 

require 'data_mapper' 
DataMapper::Logger.new($stdout, :debug) 
DataMapper.setup(:default, 'sqlite3::memory:') 

class LevelStatus 
    include DataMapper::Resource 
    property :id, Serial 
    property :italian, Float 
    property :hairbender, Float 
    property :decaf, Float 
end 

DataMapper.finalize 
LevelStatus.auto_migrate! 

post '/update-levels' do 
    @status = LevelStatus.create(
    :italian => params[:italian], 
    :hairbender => params[:hairbender], 
    :decaf => params[:decaf] 
) 
    status 200 
end 

當我POST/update-levels有時我得到的消息:

DataObjects::SyntaxError - no such table: level_statuses 

什麼是錯我的代碼,這是造成這個錯誤?

+0

如果你指定一個文件,而不是使用SQLite3內存存儲,它是否工作? – dkubb

+1

類似的問題(和可能的解釋)在這裏:http://stackoverflow.com/questions/6904298/no-such-table-error-from-sqlite-memory-db-via-datamapper – matt

+0

啊,所以它看起來像在內存SQLite數據庫是問題。將其更改爲文件支持的數據庫應該可以解決問題。我會嘗試的。 – Andrew

回答

0

馬特上述評論說,this answer似乎可以解釋這個問題:

的問題是,我懷疑,由於線程池這DataMapper的(或者更準確地說,數據對象,數據庫驅動程序的DataMapper使用)自動執行。數據庫連接不在線程之間共享。對於像postgresql或mysql甚至sqlite3這樣的文件來說,這是很好的(甚至是有益的),作爲'文件支持'的數據庫。在內存中存儲sqlite3的情況下,連接就是數據庫。所以額外的線程將因此失敗。此外,經過一段時間的不活動(〜1分鐘?),線程將被清除,數據庫也將消失。

如果是這樣,我不確定有一個簡單的解決方法。您可能可以修改do_sqlite3來避免這種情況。另一種基本上應該儘可能快的方法是在ramdrive上使用文件支持的sqlite3數據庫。

0

肯定,線程池的SQLite實際行爲,

但檢查DataMapper documentation,部分:寫作遷移不太需要

只需要允許的DataMapper來控制你的架構

DataMapper.auto_migrate! 
DataMapper.auto_upgrade!