Синатра, DataMapper: нет таких ошибок таблицы - PullRequest
2 голосов
/ 25 августа 2011

Не уверен, почему я получаю эту ошибку в своих журналах. Эта ошибка случается так часто, но не всегда, и я не знаю почему. Вот мой код:

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 ]

2 голосов
/ 16 января 2015

уверен, пул потоков реальное поведение SQLite,

но проверьте Документация DataMapper , раздел: Меньше необходимости в написании миграций

нужно просто позволить DataMapper управлять вашей схемой

DataMapper.auto_migrate!
DataMapper.auto_upgrade!
0 голосов
/ 09 октября 2011

Как сказал Мэтт в комментарии выше, этот ответ , кажется, объясняет проблему:

Проблема, я подозреваю, из-за пула потоков, который DataMapper (илиболее точно, DataObjects, драйвер базы данных, используемый DataMapper), делает это автоматически.Соединение с базой данных не разделяется между потоками.Это хорошо (и даже полезно) для чего-то вроде postgresql, mysql или даже sqlite3 в качестве базы данных с файловой поддержкой.В случае sqlite3 в хранилище памяти, соединение является базой данных.Таким образом, дополнительные потоки потерпят неудачу по этой причине.Кроме того, после некоторого периода бездействия (~ 1 мин?) Поток будет очищен и база данных тоже будет удалена.

Если это так, я не уверен, что есть легкая работа вокруг.Вы можете изменить do_sqlite3, чтобы избежать этого.Другой альтернативой, которая должна быть в основном такой же быстрой, является использование базы данных sqlite3 с файловой поддержкой на оперативном диске.

...