Uruchom pojedynczy plik migracji

Czy istnieje łatwy sposób na przeprowadzenie pojedynczej migracji? Nie chcę migrować do określonej wersji, chcę tylko uruchomić konkretną.

Author: nan, 2009-04-16

10 answers

Możesz po prostu uruchomić kod bezpośrednio z pliku ruby:

rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up

Uwaga: nowsze wersje rails mogą wymagać AddFoos.new.up zamiast AddFoos.up.

Alternatywny sposób (bez IRB), który polega na tym, że require zwraca tablicę nazw klas:

script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'

Zauważ, że jeśli to zrobisz, prawdopodobnie nie zaktualizuje tabeli schema_migrations, ale wydaje się, że i tak tego chcesz.

 210
Author: Orion Edwards,
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-11-04 23:18:23

Zakładając dość najnowszą wersję Rails zawsze można uruchomić:

rake db:migrate:up VERSION=20090408054532

Gdzie version jest znacznikiem czasu w nazwie pliku migracji.

Edit: w pewnym momencie w ciągu ostatnich 8 lat (nie jestem pewien, jaka wersja) Rails dodało kontrole, które zapobiegają uruchomieniu tego programu, jeśli już został uruchomiony. Wskazuje to wpis w tabeli schema_migrations. Aby go ponownie uruchomić, po prostu wykonaj rake db:migrate:redo VERSION=20090408054532.

 355
Author: gtd,
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
2018-06-30 15:23:28

Jeśli chcesz przeprowadzić migrację specyficzną , wykonaj

$ rake db:migrate:up VERSION=20080906120000

Jeśli chcesz uruchomić migracje wiele razy, wykonaj

# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3

Jeśli chcesz uruchomić pojedynczy migracja wiele razy, wykonaj

# this is super useful
$ rake db:migrate:redo VERSION=20080906120000

(Numer wersji można znaleźć w nazwie pliku migracji)


Edit: Możesz również po prostu zmienić nazwę pliku migracji, np:

20151013131830_my_migration.rb -> 20151013131831_my_migration.rb

Następnie migrować normalnie, to będzie traktować migracja jako nowa (przydatna, jeśli chcesz przeprowadzić migrację w środowisku zdalnym (takim jak staging), nad którym masz mniejszą kontrolę.

Edit 2: Możesz również po prostu nuke wpis migracji w bazie danych. Eg:

rails_c> q = "delete from schema_migrations where version = '20151013131830'"
rails_c> ActiveRecord::Base.connection.execute(q)

rake db:migrate Następnie ponownie uruchomi metodę up z nuked migrations.

 94
Author: Benjamin Crouzier,
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
2015-11-02 10:07:32

Jeśli zaimplementowałeś change metodę taką jak ta:

class AddPartNumberToProducts < ActiveRecord::Migration
  def change
    add_column :products, :part_number, :string
  end
end

Możesz utworzyć instancję migracji i uruchomić migrate(:up) lub migrate(:down) na instancji, jak to:

$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
 24
Author: chibicode,
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
2013-07-24 21:20:16

To są kroki, aby uruchomić ponownie ten plik migracji " 20150927161307_create_users.rb "

  1. Uruchom tryb konsoli. (rails c)
  2. Skopiuj i prześlij klasę znajdującą się w tym pliku do konsoli.

    class CreateUsers < ActiveRecord::Migration
      def change
        create_table :users do |t|
          t.string :name
          t.string :email
          t.timestamps null: false   end
        end
      end
    end
    
  3. Utwórz instancję klasy CreateUsers: c1 = CreateUsers.new

  4. wykonaj metodę change tej instancji: c1.change
 15
Author: rolph dzounga,
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
2015-09-28 02:55:25

Jeśli masz problemy ze ścieżkami możesz użyć

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
 11
Author: Dejan Cancarevic,
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-10-23 10:18:26

Od rails 5 Możesz również użyć rails zamiast rake

Szyny 3 - 4

# < rails-5.0
rake db:migrate:up VERSION=20160920130051

Rails 5

# >= rails-5.0
rake db:migrate:up VERSION=20160920130051

# or

rails db:migrate:up VERSION=20160920130051
 11
Author: Deepak Mahakale,
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
2017-09-23 17:33:16

Proszę zauważyć, że zamiast script/runner, może być konieczne użycie rails runner w nowych środowiskach rails.

 5
Author: viniciusnz,
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-02-26 02:27:52

Metoda 1:

rake db:migrate:up VERSION=20080906120000

Metoda 2:

W Konsoli Rails 1. Skopiuj wklej klasę migracji w konsoli (powiedzmy add_name_to_user.rb) 2. Następnie w konsoli wpisz następujące

Sharding.run_on_all_shards{AddNameToUser.up}
Zrobione!!
 5
Author: ramya,
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
2015-05-26 08:41:55

Wygląda na to, że przynajmniej w najnowszym wydaniu Rails (5.2 w momencie pisania) jest jeszcze jeden sposób filtrowania uruchamianych migracji. Można przepuścić filtr w zmiennej środowiskowej SCOPE, która będzie następnie używana do wybierania plików migracji.

Zakładając, że masz dwa pliki migracji 1_add_foos.rb i 2_add_foos.run_this_one.rb uruchomione

SCOPE=run_this_one rails db:migrate:up

Wybierze i uruchomi tylko 2_add_foos.run_this_one.rb. Należy pamiętać, że wszystkie pliki migracji pasujące do zakresu zostaną uruchomione.

 1
Author: szymek,
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
2018-04-10 07:57:45