Каков правильный способ настройки базы данных с помощью 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
Ответы
Ответ 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