2

不知道为什么我的日志中出现此错误。这个错误经常发生,但并非始终如一,我不知道为什么。这是我的代码:

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

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

4

2 回答 2

2

当然,线程池SQLite 的实际行为,

但请查看DataMapper 文档,部分:减少编写迁移的需要

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

DataMapper.auto_migrate!
DataMapper.auto_upgrade!
于 2015-01-16T15:32:35.897 回答
0

正如马特在上面的评论中所说,这个答案似乎可以解释这个问题:

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

如果是这样,我不确定是否有一个简单的解决方法。您也许可以修改 do_sqlite3 来避免这种情况。另一个应该基本一样快的替代方法是在 ramdrive 上使用文件支持的 sqlite3 DB。

于 2011-10-09T02:25:56.480 回答