不确定我在日志中收到此错误的原因。这种错误经常发生,但并不一致,我不确定为什么。这是我的代码:
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 :(得分: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数据库。