如何使用Sinatra和DataMapper迁移数据库?

时间:2015-03-13 03:43:48

标签: ruby database sqlite sinatra

我正在尝试编写一个简单的Sinatra Web应用程序,其中包含可以添加或读取的任务列表。现在我开始列表为空。

这是我的代码:

require 'sinatra'
require 'slim'
require 'data_mapper'


module TaskerApp
  class App < Sinatra::Base
    configure do
      DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/development.db")
      DataMapper.finalize
      DataMapper.auto_migrate!
      DataMapper.auto_upgrade!
    end

    get '/' do
      @tasks = Task.all
      slim :index
    end
  end

  class Task
    include DataMapper::Resource
    property :id,       Serial
    property :owner,        String, :required => true
    property :time,     DateTime
  end
end

如果我使用rackup config.ru这样运行它,那么转到'\'我会收到错误,数据库不存在。要正确创建数据库,我必须在程序中运行一次代码Task.auto_migrate!。我的问题是,如果我将它放在configure do中,它将在调用class Task之前运行,并且会失败,但是之后唯一可以放在get '/' do方法中的地方,每次加载'/'页面时它都会运行,我觉得这个页面太多了。

这样做的正确方法是什么?

由于

1 个答案:

答案 0 :(得分:1)

我通过将整个Task类放在model.rb文件中,并在主文件的顶部添加require './model.rb'来解决它。 model.rb看起来像这样:

require 'rubygems'
require 'data_mapper'
require 'dm-sqlite-adapter'
require 'bcrypt'

DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/development.db")

class Task
  include DataMapper::Resource
  property :id,     Serial
  property :owner,      String, :required => true
  property :time,       DateTime
end

DataMapper.finalize
DataMapper.auto_migrate!
DataMapper.auto_upgrade!
Task.auto_migrate!

希望这有助于将来。