从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
块中,因此不会在生产服务器上调用它。当我在其中添加或删除列时,我应该如何升级数据库?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
答案 0 :(得分:7)
来自http://rdoc.info/github/datamapper/dm-core/DataMapper#finalize-class_method
加载所有模型和插件后,应调用此方法。
这取决于您的托管安排,但主要做的是将迁移的运行放在Rake任务中,并在部署应用程序时运行它们。如果您正在使用Sqlite,则会创建数据库(尽管在某些主机上您不允许更新文件系统)。我不认为将Sqlite用于生产数据库是个好主意,但这是你的决定。
使用Rake任务。在每次部署之后,您将运行“db:migrate:up”(或任何您称之为)的任务,它将运行最新的迁移。您可以从Padrino's Rake tasks for DataMapper
获得一些想法