Źle nazwałem kolumnę hased_password
zamiast hashed_password
.
Jak zaktualizować schemat bazy danych, używając migracji do zmiany nazwy tej kolumny?
źródło
Źle nazwałem kolumnę hased_password
zamiast hashed_password
.
Jak zaktualizować schemat bazy danych, używając migracji do zmiany nazwy tej kolumny?
rename_column :table, :old_column, :new_column
Aby to zrobić, prawdopodobnie będziesz chciał utworzyć osobną migrację. (Zmień nazwę, FixColumnName
jak chcesz.):
script/generate migration FixColumnName
# creates db/migrate/xxxxxxxxxx_fix_column_name.rb
Następnie edytuj migrację, aby wykonać swoją wolę:
# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
def self.up
rename_column :table_name, :old_column, :new_column
end
def self.down
# rename back if you need or do something else or do nothing
end
end
W przypadku Rails 3.1 użyj:
Chociaż nadal obowiązują metody up
i down
, Rails 3.1 otrzymuje change
metodę, która „wie, jak przeprowadzić migrację bazy danych i odwrócić ją, gdy migracja zostanie wycofana bez potrzeby zapisywania oddzielnej metody wyłączania”.
Aby uzyskać więcej informacji, zobacz „ Migracje aktywnych rekordów ”.
rails g migration FixColumnName
class FixColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Jeśli zdarzy się, że masz całą grupę kolumn do zmiany nazwy lub coś, co wymagałoby powtarzania nazwy tabeli w kółko:
rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...
Możesz użyć tego, change_table
aby zachować trochę porządek:
class FixColumnNames < ActiveRecord::Migration
def change
change_table :table_name do |t|
t.rename :old_column1, :new_column1
t.rename :old_column2, :new_column2
...
end
end
end
Więc db:migrate
jak zwykle lub jakkolwiek zajmujesz się swoją działalnością.
W przypadku szyn 4:
Podczas tworzenia Migration
zmiany nazwy kolumny Rails 4 generuje change
metodę zamiast up
i down
jak wspomniano w powyższej sekcji. Wygenerowana change
metoda to:
$ > rails g migration ChangeColumnName
który utworzy plik migracji podobny do:
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
self.up
, nie powiedziałbym, żeself.down
„ zawsze powinno być odwrotnie”. W zależy od kontekstu migracji. Samo umieszczenie „przeciwieństwa” może nie być „właściwym” spadkiem migracji.def self.up
idef self.down
zedef change
i to będzie wiedzieć, jak cofnąć.change
metoda nie jest pełnym dowodem, więc zwykle używajup
idown
metod do złożonych migracji.Moim zdaniem w tym przypadku lepiej użyć
rake db:rollback
, a następnie edytować migrację i ponownie uruchomićrake db:migrate
.Jeśli jednak w kolumnie znajdują się dane, których nie chcesz stracić, użyj
rename_column
.źródło
Jeśli kolumna jest już zapełniona danymi i jest uruchomiona w produkcji, zaleciłbym podejście krok po kroku, aby uniknąć przestojów w produkcji podczas oczekiwania na migrację.
Najpierw utworzę migrację bazy danych, aby dodać kolumny z nowymi nazwami i wypełnić je wartościami ze starej nazwy kolumny.
Następnie dokonałbym właśnie tej zmiany i pchnąłbym ją do produkcji.
Potem, gdy zatwierdzenie zostanie wprowadzone do produkcji, zacznę działać.
Następnie zaktualizowałbym wszystkie widoki / kontrolery, które odwoływały się do starej nazwy kolumny do nowej nazwy kolumny. Uruchom mój zestaw testów i zatwierdź tylko te zmiany. (Po upewnieniu się, że działa lokalnie i najpierw przejściu wszystkich testów!)
Potem zmusiłbym to zobowiązanie do produkcji.
W tym momencie możesz usunąć oryginalną kolumnę bez obawy o jakiekolwiek przestoje związane z samą migracją.
Następnie wypchnij najnowszą migrację do produkcji i uruchom ją
bundle exec rake db:migrate
w tle.Zdaję sobie sprawę, że jest to trochę bardziej zaangażowane w proces, ale wolę to zrobić niż mieć problemy z migracją produkcji.
źródło
execute "Update table_name set correct_name_column_one = old_name_column_one"
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Pod
Available Transformations
rename_column(table_name, column_name, new_column_name):
Zmienia nazwę kolumny, ale zachowuje typ i treść.
źródło
rename_column
.Uruchom poniższe polecenie, aby utworzyć plik migracji:
Następnie w pliku wygenerowanym w
db/migrate
folderze napiszrename_column
jak poniżej:źródło
Z interfejsu API:
Zmienia nazwę kolumny, ale utrzymuje typ i treść pozostaje taka sama.
źródło
Niektóre wersje Ruby on Rails obsługują metodę migracji w górę / w dół, a jeśli masz migrację w górę / w dół, to:
Jeśli masz
change
metodę migracji, to:Aby uzyskać więcej informacji, możesz przenieść: Ruby on Rails - Migrations lub Active Record Migrations .
źródło
Jeśli twój kod nie jest współdzielony z innym, najlepszym rozwiązaniem jest dokonanie
rake db:rollback
edycji nazwy kolumny podczas migracji irake db:migrate
. Otóż toMożesz napisać kolejną migrację, aby zmienić nazwę kolumny
Otóż to.
źródło
rake db:rollback
to świetna sugestia. Ale jak powiedziałeś, tylko jeśli migracja nie została jeszcze przesunięta.Alternatywnie, jeśli nie jesteś żonaty z ideą migracji, istnieje atrakcyjny klejnot dla ActiveRecord, który będzie automatycznie obsługiwał zmiany nazw dla ciebie, styl Datamapper. Wszystko, co musisz zrobić, to zmienić nazwę kolumny w swoim modelu (i upewnij się, że umieściłeś Model.auto_upgrade! Na dole swojego modelu.rb) i viola! Baza danych jest aktualizowana na bieżąco.
https://github.com/DAddYE/mini_record
Uwaga: Aby zapobiec konfliktom, musisz nuke db / schema.rb
Wciąż w fazie beta i oczywiście nie dla wszystkich, ale wciąż przekonujący wybór (obecnie używam go w dwóch nietrywialnych aplikacjach produkcyjnych bez problemów)
źródło
Jeśli musisz zmienić nazwy kolumn, musisz utworzyć symbol zastępczy, aby uniknąć błędu duplikatu nazwy kolumny . Oto przykład:
źródło
Jeśli obecne dane nie są dla Ciebie ważne, możesz po prostu usunąć oryginalną migrację, używając:
Bez cudzysłowów wprowadź zmiany w oryginalnej migracji i ponownie uruchom migrację w górę, wykonując:
źródło
Po prostu utwórz nową migrację, a w bloku użyj
rename_column
jak poniżej.źródło
W przypadku Ruby on Rails 4:
źródło
Ręcznie możemy użyć poniższej metody:
Możemy edytować migrację ręcznie, jak:
otwarty
app/db/migrate/xxxxxxxxx_migration_file.rb
Zaktualizuj
hased_password
dohashed_password
Uruchom poniższe polecenie
Następnie usunie migrację:
Spowoduje to dodanie migracji wraz ze zaktualizowaną zmianą.
źródło
Wygeneruj plik migracji:
# Tworzy db / migrate / xxxxxxxxxx.rb
Edytuj migrację, aby wykonać swoją wolę.
źródło
Biegać
rails g migration ChangesNameInUsers
(lub jakkolwiek chcesz to nazwać)Otwórz właśnie utworzony plik migracji i dodaj ten wiersz w metodzie (pomiędzy
def change
iend
):rename_column :table_name, :the_name_you_want_to_change, :the_new_name
Zapisz plik i uruchom
rake db:migrate
w konsoliSprawdź swoje
schema.db
, aby zobaczyć, czy nazwa rzeczywiście się zmieniła w bazie danych!Mam nadzieję że to pomoże :)
źródło
Spójrzmy prawdzie w KISS . Wystarczy trzy proste kroki. Poniższe działa dla Railsów 5.2 .
1. Utwórz migrację
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
- w ten sposób jest całkowicie jasne dla opiekunów bazy kodu później. (użyj liczby mnogiej jako nazwy tabeli).2. Edytuj migrację
# I prefer to explicitly write the
w górę wand
dółmethods.
# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb
3. Uruchom migracje
rake db:migrate
I startujesz w wyścigach!
źródło
Otwórz ten plik migracji i zmodyfikuj go jak poniżej (Podaj oryginał
table_name
)źródło
źródło
Wygeneruj migrację Ruby on Rails :
Wstaw kod do pliku migracji (XXXXXfixcolumnname.rb) :
źródło
Otwórz konsolę Ruby on Rails i wprowadź:
źródło
Możesz to zrobić na dwa sposoby:
W tym typie automatycznie uruchamia jego kod zwrotny podczas wycofywania.
Do tego typu uruchamia metodę „up” kiedy
rake db:migrate
i uruchamia metodę „down”, gdyrake db:rollback
:źródło
Jestem na szynach 5.2 i próbuję zmienić nazwę kolumny na urządzeniu użytkownika.
rename_column
nieco pracował dla mnie, ale liczba pojedyncza:table_name
rzucił „tabeli użytkownika nie znaleziono” błąd. Liczba mnoga zadziałała dla mnie.Następnie zmień plik migracji na ten:
Gdzie: agent? to stara nazwa kolumny.
źródło
Aktualizacja - bliskim kuzynem create_table jest change_table, służący do zmiany istniejących tabel. Jest on używany w podobny sposób do create_table, ale obiekt przekazany do bloku zna więcej sztuczek. Na przykład:
Ten sposób jest bardziej wydajny, jeśli robimy to z innymi metodami modyfikacji, takimi jak: usuń / dodaj indeks / usuń indeks / dodaj kolumnę, np. Możemy zrobić dalej, jak:
źródło
Po prostu wygeneruj migrację za pomocą polecenia
Po tej edycji migracji dodaj następujący wiersz w metodzie zmiany
To powinno załatwić sprawę.
źródło
Zmiany w migracji Rails 5
na przykład:
jeśli chcesz zmienić kolumnę nazwa_ studenta jako nazwę
Uwaga: - jeśli nie uruchomisz szyny db: migruj
Możesz wykonać następujące kroki
Spowoduje to usunięcie wygenerowanego pliku migracji. Teraz możesz poprawić nazwę kolumny
Jeśli przeprowadziłeś migrację (rails db: migrate), wykonaj następujące opcje, aby zmienić nazwę kolumny
źródło
rails g migration RemoveStudentNameFromStudentS student_name:string
(uczniowie są w liczbie mnogiej)?