在生产服务器上使用DataMapper和Sinatra设置数据库的正确方法是什么?

时间:2013-05-02 08:19:38

标签: ruby sqlite sinatra datamapper

DataMapper document开始,我认为至少需要调用四个函数来设置数据库:

DataMapper.setup(:default, 'sqlite:///path/to/project.db')
DataMapper.finalize
DataMapper.auto_migrate!
DataMapper.auto_upgrade!

在许多DataMapper + Sinatra教程中,我了解到每次在生产服务器上加载应用程序时都不应调用auto_migrate!auto_upgrade!。但同时许多例子在sinatra应用程序的主ruby文件中调用这些函数,比如app.rb,而无需额外检查。并且一些示例根本不调用finalize。到目前为止,我很困惑,我不知道在生产服务器上该怎么做。

以下以简单的app.rb为例,我有一些问题:

  1. 应该finalize的地点和时间?
  2. 首次部署应用时,生产服务器上没有db文件,如何自动创建?或者我是否必须手动创建project.db文件?
  3. 由于auto_upgrade!包含在:development块中,因此不会在生产服务器上调用它。当我在其中添加或删除列时,我应该如何升级数据库?
  4. require 'sinatra'
    require 'data_mapper'
    
    configure do
      DataMapper.setup :default, "sqlite3://#{Dir.pwd}/project.db"
    end
    
    class Book
      include DataMapper::Resource
      property :id, Serial
      property :title, Text
    
      belongs_to :author
    end
    
    class Author
      include DataMapper::Resource
      property :id, Serial
      property :name, Text
    
      has n, :books
    end
    
    configure :development do
      DataMapper.auto_upgrade!
    end
    
    get '/:id' do
      @author = Author.get params[:id]
      erb :list_author_and_his_books # The template has nothing to do with this question, ignore it
    end
    
    get '/new' do
      # Some code for user to input book or author details
    end
    
    get '/create' do
      # Some code to create book or author in db
    end
    

    感谢您阅读这篇长篇文章:D

1 个答案:

答案 0 :(得分:7)

应该在何时何地进行最终确定?

来自http://rdoc.info/github/datamapper/dm-core/DataMapper#finalize-class_method

  

加载所有模型和插件后,应调用此方法。

首次部署应用程序时,生产服务器上没有db文件,如何自动创建?或者我是否必须手动创建project.db文件?

这取决于您的托管安排,但主要做的是将迁移的运行放在Rake任务中,并在部署应用程序时运行它们。如果您正在使用Sqlite,则会创建数据库(尽管在某些主机上您不允许更新文件系统)。我不认为将Sqlite用于生产数据库是个好主意,但这是你的决定。

自auto_upgrade以来!包装在:开发块中,它不会在生产服务器上调用。当我在其中添加或删除列时,我应该如何升级数据库?

使用Rake任务。在每次部署之后,您将运行“db:migrate:up”(或任何您称之为)的任务,它将运行最新的迁移。您可以从Padrino's Rake tasks for DataMapper

获得一些想法