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为例,我有一些问题:
>哪里和什么时候应该最终被调用?
>首次部署应用程序时,生产服务器上没有数据库文件,如何自动创建?还是手动创建project.db文件?
>自从auto_upgrade!包装在:开发块,它不会在生产服务器上调用.当我添加或删除列时,我应该如何升级数据库?
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
解决方法
从http://rdoc.info/github/datamapper/dm-core/DataMapper#finalize-class_method
This method should be called after loading all models and plugins.
首次部署应用程序时,如何自动创建?还是手动创建project.db文件?
这取决于您的托管安排,但主要的工作是将迁移运行在Rake任务中,并在应用程序部署时运行它们.如果您使用sqlite,这将创建数据库(尽管在某些主机上,您不允许更新文件系统).我不认为使用sqlite来生产数据库是个好主意,但这是你的决定.
自从auto_upgrade!包装在:开发块,我应该如何升级数据库?
使用耙子任务.在每次部署之后,您将运行“db:migrate:up”(或任何您称之为)任务,并运行最新的迁移.您可能会从Padrino’s Rake tasks for DataMapper获得一些想法