db: schema: load vs db: migrate with capistrano
Mam aplikację rails, którą przenoszę na inny serwer i myślę, że powinienem użyć db:schema:load do utworzenia bazy danych mysql, ponieważ jest to zalecane. Mój problem polega na tym, że używam capistrano do wdrożenia i wydaje się być defaulting do rake db:migrate zamiast. Czy istnieje sposób, aby to zmienić, czy capistrano używa db: migrate nie bez powodu?
4 answers
Dlaczego używać db: schema: load
Stwierdzam, że moje własne migracje ostatecznie dokonują tasowania danych (Załóżmy, że łączę kolumny first_name i last_name w kolumnę full_name). Jak tylko to zrobię, zacznę używać ActiveRecord do przeszukiwania rekordów bazy danych, a twoje modele w końcu przyjmują założenia dotyczące pewnych kolumn. Na przykład moja tabela " osoba "została później podana kolumna" pozycja", według której ludzie są sortowane. Wcześniejsze migracje nie są teraz wybierane danych, ponieważ kolumna "position" jeszcze nie istnieje.
Jak zmienić domyślne zachowanie w Capistrano
Podsumowując, wierzę deploy:cold
należy użyć db:schema:load
zamiast db:migrate
. Rozwiązałem ten problem zmieniając środkowy krok, który Capistrano wykonuje na zimnym rozlocie. Dla Capistrano v2. 5. 9 domyślne zadanie w kodzie biblioteki wygląda tak.
namespace :deploy do
...
task :cold do
update
migrate # This step performs `rake db:migrate`.
start
end
...
end
Przeredagowałem zadanie w moim deploy.rb
w następujący sposób.
namespace :deploy do
task :cold do # Overriding the default deploy:cold
update
load_schema # My own step, replacing migrations.
start
end
task :load_schema, :roles => :app do
run "cd #{current_path}; rake db:schema:load"
end
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-06 01:08:49
Wspinając się na barki Andres Jaan Tack, Adam Spiers i Kamiel Wanrooij, zbudowałem następujące zadanie do nadpisania deploy:cold.
task :cold do
transaction do
update
setup_db #replacing migrate in original
start
end
end
task :setup_db, :roles => :app do
raise RuntimeError.new('db:setup aborted!') unless Capistrano::CLI.ui.ask("About to `rake db:setup`. Are you sure to wipe the entire database (anything other than 'yes' aborts):") == 'yes'
run "cd #{current_path}; bundle exec rake db:setup RAILS_ENV=#{rails_env}"
end
Moje ulepszenia są tutaj...
- owiń go
transaction do
, tak aby Capistrano zrobił właściwe cofnięcie po przerwaniu. - robi
db:setup
zamiastdb:schema:load
, tak, że jeśli baza danych jeszcze nie istnieje, zostanie utworzona przed załadowaniem schematu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-12 23:05:57
To świetna odpowiedź od Andres Jaan Tack. Chciałem tylko dodać kilka komentarzy.
Po pierwsze, oto ulepszona wersja zadania Andres ' a deploy:load_schema
, która zawiera ostrzeżenie, a co ważniejsze używa bundle exec
i RAILS_ENV
, aby upewnić się, że środowisko jest poprawnie skonfigurowane:
namespace :deploy do
desc 'Load DB schema - CAUTION: rewrites database!'
task :load_schema, :roles => :app do
run "cd #{current_path}; bundle exec rake db:schema:load RAILS_ENV=#{rails_env}"
end
end
Złożyłem prośbę o zaimplementowanie deploy:load_schema
w Capistrano. W tym wniosku zauważyłem, że debata "db:schema:load
vs. db:migrate
" została już omówiona w Capistrano grupa dyskusyjna , i była pewna niechęć do zmiany zadania deploy:cold
na użycie db:schema:load
przez db:migrate
, ponieważ jeśli zostanie uruchomiona przypadkowo, pierwsza atomówka zniszczy całą bazę danych, podczas gdy druga prawdopodobnie będzie narzekać i bez szkody. Niemniej jednak db:schema:load
jest technicznie lepszym podejściem, więc jeśli ryzyko przypadkowej utraty danych może być ograniczone, warto byłoby zmienić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-17 23:23:44
W Capistrano 3 / Rails 4, domyślna składnia deploy została zmieniona. Możesz to zrobić zamiast tego:
desc 'Deploy app for first time'
task :cold do
invoke 'deploy:starting'
invoke 'deploy:started'
invoke 'deploy:updating'
invoke 'bundler:install'
invoke 'deploy:db_setup' # This replaces deploy:migrations
invoke 'deploy:compile_assets'
invoke 'deploy:normalize_assets'
invoke 'deploy:publishing'
invoke 'deploy:published'
invoke 'deploy:finishing'
invoke 'deploy:finished'
end
desc 'Setup database'
task :db_setup do
on roles(:db) do
within release_path do
with rails_env: (fetch(:rails_env) || fetch(:stage)) do
execute :rake, 'db:setup' # This creates the database tables AND seeds
end
end
end
end
Jeśli zachowujesz ostrożność podczas ręcznego wywoływania standardowych zadań Wdróż w zadaniu :cold
(ponieważ mogą się one zmienić w nadchodzącej wersji lub jeśli masz niestandardowe zadanie Wdróż), możesz po prostu wywołać deploy:db_setup
przed uruchomieniem deploy
.
Aby wykonać db:schema:load
zamiast db:setup
, możesz po prostu zmienić zadanie rake, w następujący sposób:
desc 'Load DB Schema'
task :db_schema_load do
...
execute :rake, 'db:schema:load'
...
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-02 20:13:52