【问题标题】:What is the correct way to setup database with DataMapper and Sinatra on production server?在生产服务器上使用 DataMapper 和 Sinatra 设置数据库的正确方法是什么?
【发布时间】:2013-04-26 08:22:54
【问题描述】:

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

【问题讨论】:

    标签: ruby sqlite sinatra datamapper


    【解决方案1】:

    应该在何时何地调用 finalize?

    来自http://rdoc.info/github/datamapper/dm-core/DataMapper#finalize-class_method

    这个方法应该在加载完所有模型和插件后调用。

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

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

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

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

    【讨论】:

    • 感谢@iain,以后会替换sqlite3!您认为将数据库定义与主 app.rb 分开并使用任务显式运行迁移或升级更好吗?
    • @hsw 这取决于你。我倾向于将模型放在app/models 中,将迁移放在db/migrations 中。在部署时,我将运行一个运行迁移的 rake 任务。我在 config.ru 中需要的模型(或者通常是一个 init 文件,因为设置会增长,增长,增长!:) 在主应用程序文件之前。顺便说一句,I found this,它应该更有帮助。查看this question 了解如何布局您的应用程序的想法。不过,这取决于你,它是 Sinatra。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2011-06-20
    • 2014-01-20
    • 2019-09-02
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多