来自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
为例,我有一些问题:
- 应该在何时何地调用
finalize
? - 第一次部署应用程序时,生产服务器上没有
db
文件,如何自动创建它?还是我必须手动创建project.db
文件? - 由于
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/