2011-08-25 73 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!