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

Ruby 在生产服务器上使用DataMapper和Sinatra设置数据库的正确方法是什么?,ruby,sqlite,sinatra,datamapper,Ruby,Sqlite,Sinatra,Datamapper,从中,我认为至少需要调用四个函数才能进行数据库设置: DataMapper.setup(:默认值,'sqlite:///path/to/project.db') DataMapper.finalize DataMapper.auto_迁移! DataMapper.auto_升级! 在许多DataMapper+Sinatra教程中,我学到了auto\u migrate和自动升级不应在每次将应用程序加载到生产服务器时调用。但与此同时,许多示例在sinatra应用程序的主ruby文件中调用这些函数,

从中,我认为至少需要调用四个函数才能进行数据库设置:

DataMapper.setup(:默认值,'sqlite:///path/to/project.db')
DataMapper.finalize
DataMapper.auto_迁移!
DataMapper.auto_升级!
在许多DataMapper+Sinatra教程中,我学到了
auto\u migrate
自动升级不应在每次将应用程序加载到生产服务器时调用。但与此同时,许多示例在sinatra应用程序的主ruby文件中调用这些函数,比如
app.rb
,而无需额外检查。有些示例根本不调用
finalize
。到目前为止,我感到困惑,不知道在生产服务器上该做什么

以下面这个简单的
app.rb
为例,我有一些问题:

  • 应在何时何地调用
    finalize
  • 首次部署应用程序时,生产服务器上没有
    db
    文件,如何自动创建?或者我必须手动创建
    project.db
    文件吗
  • 自动升级以来被包装在
    :development
    块中,不会在生产服务器上调用它。当我在数据库中添加或删除列时,应该如何升级数据库
  • 需要“sinatra”
    需要“数据映射器”
    配置do
    DataMapper.setup:默认值,“sqlite3://{Dir.pwd}/project.db”
    结束
    课堂用书
    包含数据映射器::资源
    属性:id,序列号
    属性:标题、文本
    属于:作者
    结束
    类作者
    包含数据映射器::资源
    属性:id,序列号
    属性:名称,文本
    他有书吗
    结束
    配置:开发吗
    DataMapper.auto_升级!
    结束
    获取“/:id”do
    @author=author.get参数[:id]
    erb:列出作者和他的书,模板与这个问题无关,忽略它
    结束
    获取“/新”do
    #用户输入书籍或作者详细信息的一些代码
    结束
    获取“/create”do
    #在db中创建书籍或作者的一些代码
    结束
    
    感谢您阅读这篇长篇博文:D

    应该在何时何地拨打finalize? 从

    加载所有模型和插件后应调用此方法

    当第一次在生产服务器上没有db文件时部署应用程序时,如何自动创建它?还是必须手动创建project.db文件? 这取决于您的托管安排,但要做的主要事情是将迁移的运行放在Rake任务中,并在部署应用程序时运行迁移。如果您使用的是Sqlite,这将创建数据库(尽管在某些主机上不允许您更新文件系统)。我认为将Sqlite用于生产数据库不是一个好主意,但这是您的决定

    自自动升级以来!封装在:开发块中,将不会在生产服务器上调用它。当我在数据库中添加或删除列时,应该如何升级数据库?
    使用Rake任务。在每次部署之后,您都会运行“db:migrate:up”(或您称之为的任何名称)任务,并且它会运行最新的迁移。您可能会从

    中得到一些想法,谢谢@iain,sqlite3将在将来被替换!您认为最好将数据库定义从主
    app.rb
    中分离出来,并使用任务明确地运行迁移或升级吗?@hsw这取决于您。我倾向于将模型放在
    app/models
    中,将迁移放在
    db/migrations
    中。在部署时,我将运行运行迁移的rake任务。我在config.ru中需要的模型(或者通常是一个init文件,因为设置将在主应用程序文件之前增长、增长、增长!:)。顺便说一句,这应该更有帮助。看看关于如何布局应用程序的想法。不过,这取决于你,是西纳特拉。