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

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

This method should be called after loading all models and plugins.

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

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

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

使用 Rake 任务。每次部署后,您将运行“db:migrate:up”(或任何您称之为的)任务,它会运行最新的迁移。您可能会从 Padrino's Rake tasks for DataMapper 中得到一些想法。

关于ruby - 在生产服务器上使用 DataMapper 和 Sinatra 设置数据库的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16333366/

相关文章:

heroku - 重定向 URL 以在 Sinatra 中添加尾部斜杠

ruby-on-rails - 使用 rake db :migrate does not change it 迁移数据

ruby - 如何获取 Savon 发送的原始请求

ruby - 有什么方法可以验证模拟或 stub 是否有效?

sql - SQLite查询-第一列总和的列

sqlite - SQLite的MATCH NONE是什么意思?

ruby - 使用 Sinatra 时如何控制静态 Assets 的缓存?

ruby-on-rails - 使用 Rails 编写 RSpec 测试时,spec/requests 文件夹和 spec/controllers 应该放什么?

ubuntu - symfony2 警告 : sqlite3 profiler database is readonly

ruby - 使用 sinatra 和 Rack::Session::Encrypted Cookie 根据每个请求更改 Cookie