Uruchom pojedynczy plik migracji
Czy istnieje łatwy sposób na przeprowadzenie pojedynczej migracji? Nie chcę migrować do określonej wersji, chcę tylko uruchomić konkretną.
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.
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
.
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.
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)
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 "
- Uruchom tryb konsoli. (rails c)
-
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
Utwórz instancję klasy
CreateUsers
:c1 = CreateUsers.new
- wykonaj metodę
change
tej instancji:c1.change
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'
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
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.
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!!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.
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