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文件,因为设置将在主应用程序文件之前增长、增长、增长!:)。顺便说一句,这应该更有帮助。看看关于如何布局应用程序的想法。不过,这取决于你,是西纳特拉。