【问题标题】:Sinatra, DataMapper: No such table errorsSinatra,DataMapper:没有此类表错误
【发布时间】:2011-11-03 06:27:35
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您指定一个文件而不是使用 SQLite3 内存存储,它会起作用吗?
  • 类似的问题(和可能的解释)在这里:stackoverflow.com/questions/6904298/…
  • 啊,看来内存中的 SQLite 数据库是问题所在。将其更改为文件支持的数据库应该可以解决问题。我会试试的。

标签: ruby sinatra ruby-datamapper


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    DataMapper.auto_migrate!
    DataMapper.auto_upgrade!
    

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多