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

Wen*_*Wen 13 ruby sqlite datamapper sinatra

DataMapper文档中,我认为至少需要调用四个函数才能进行数据库设置:

DataMapper.setup(:default, 'sqlite:///path/to/project.db')
DataMapper.finalize
DataMapper.auto_migrate!
DataMapper.auto_upgrade!
Run Code Online (Sandbox Code Playgroud)

在许多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
Run Code Online (Sandbox Code Playgroud)

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

iai*_*ain 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的DataMapper的Rake任务中获得一些想法

  • @hsw这取决于你.我倾向于将模型放在`app/models`中并在`db/migrations`中进行迁移.在部署时,我将运行一个运行迁移的rake任务.我在config.ru中需要的模型(或者通常是一个init文件,因为设置会在主应用程序文件之前增长,增长,增长!:).顺便说一句,[我发现这个](https://github.com/datamapper/dm-migrations/tree/master/examples),它应该会更有帮助.请查看[此问题](http://stackoverflow.com/questions/5015471/using-sinatra-for-larger-projects-via-multiple-files),了解有关如何布置应用的建议.这取决于你,它是Sinatra. (2认同)