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



从DataMapper文档,我认为至少有四个函数需要调用有数据库设置:

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块中,因此它不会在生产服务器上被调用。当我添加或删除列时,我应该如何升级数据库?
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

finalize应该在何时何地调用?

从http://rdoc.info/github/datamapper/dm-core/DataMapper finalize-class_method

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

当部署应用程序时,第一次在生产服务器上没有db文件,我如何让它自动创建?或者我必须手动创建project.db文件吗?

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

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

使用Rake任务。在每次部署之后,您将运行"db:migrate:up"(或者您叫它什么)任务,它将运行最新的迁移。您可能会从Padrino为DataMapper编写的Rake任务中获得一些想法

最新更新