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?

Author: Anon, 2009-08-25

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
 32
Author: Andres Jaan Tack,
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 zamiast db:schema:load, tak, że jeśli baza danych jeszcze nie istnieje, zostanie utworzona przed załadowaniem schematu.
 10
Author: Jon Garvin,
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ć.

 6
Author: Adam Spiers,
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
 1
Author: Xavier,
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