Подтвердить что ты не робот

Каков правильный способ настройки базы данных с помощью DataMapper и Sinatra на производственном сервере?

Из документа DataMapper, я думаю, что для настройки базы данных необходимо вызвать как минимум четыре функции:

DataMapper.setup(:default, 'sqlite:///path/to/project.db')
DataMapper.finalize
DataMapper.auto_migrate!
DataMapper.auto_upgrade!

Во многих обучающих программах DataMapper + Sinatra я узнал, что auto_migrate! и auto_upgrade! не должны вызываться каждый раз, когда приложение загружается на рабочий сервер. Но в то же время многие примеры называют эти функции в основном рубиновом файле приложения sinatra, скажем 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

4b9b3361

Ответ 1

Где и когда следует вызывать завершение?

От http://rdoc.info/github/datamapper/dm-core/DataMapper#finalize-class_method

Этот метод следует вызывать после загрузки всех моделей и плагинов.

При первом развертывании приложения на рабочем сервере нет файла db, как его создать автоматически? Или мне нужно создать файл project.db вручную?

Это зависит от вашего расположения хостинга, но главное, что нужно сделать, - это запустить миграцию в задаче Rake и запустить их при развертывании приложения. Если вы используете Sqlite, это создаст базу данных (хотя на некоторых хостах вам не разрешено обновлять файловую систему). Я не думаю, что это хорошая идея использовать Sqlite для производственной базы данных, но это ваше решение.

Так как auto_upgrade! заключен в: блок разработки, он не будет вызываться на производственном сервере. Как я могу обновить базу данных при добавлении или удалении столбцов в ней?

Используйте задачу Rake. После каждого развертывания вы запускаете задачу "db: migrate: up" (или как бы вы ее назвали), и она будет запускать последние миграции. Вы можете получить несколько идей от задачи Падрина Rake для DataMapper