Sinatra,DataMapper:没有这样的表错误

时间:2011-08-25 00:09:03

标签: ruby sinatra ruby-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

我的代码导致此错误有什么问题?

2 个答案:

答案 0 :(得分:2)

确定,线程池 SQLite的实际行为,

但请检查DataMapper documentation部分:减少编写迁移的需求

只需要允许DataMapper控制您的架构

DataMapper.auto_migrate!
DataMapper.auto_upgrade!

答案 1 :(得分:0)

正如亚特在上面的评论中所说,this answer似乎解释了这个问题:

  

问题是,我怀疑,由于线程池,DataMapper(或更准确地说,DataObjects,DataMapper使用的数据库驱动程序)会自动执行。线程之间不共享数据库连接。这对于像postgresql或mysql甚至sqlite3这样的“文件支持”数据库来说是好的(甚至是有益的)。对于内存存储中的sqlite3,连接是数据库。因此,额外的线程将失败。此外,经过一段时间不活动(约1分钟?)后,线程将被清除,数据库也会消失。

     

如果是这样,我不确定是否有轻松的解决方法。您可以修改do_sqlite3以避免这种情况。另一个应该基本上同样快的替代方案是在ramdrive上使用文件支持的sqlite3数据库。