Dodałem stół, który, jak sądzę, będzie mi potrzebny, ale już nie planuję go używać. Jak powinienem usunąć ten stół?
Już uruchomiłem migracje, więc tabela jest w mojej bazie danych. Myślę, że rails generate migration
powinienem sobie z tym poradzić, ale nie wiem, jak to zrobić.
Próbowałem:
rails generate migration drop_tablename
ale to wygenerowało pustą migrację.
Jaki jest „oficjalny” sposób na upuszczenie stołu w Railsach?
ruby-on-rails
database
ruby-on-rails-3
migration
rake
Jason Whitehorn
źródło
źródło
rails generate migration
ma opcje wiersza polecenia do generowania kodu migracji do tworzenia tabel, dodawania lub zmieniania kolumn itp., Byłoby miło, gdyby miał również opcję upuszczenia tabeli - ale tak nie jest. Jasne, napisanieup
części jest proste - wystarczy wywołaćdrop_table
- aledown
część, ponownie generując tabelę, może nie zawsze być taka prosta, szczególnie jeśli schemat danej tabeli został zmieniony przez migracje po jej początkowym utworzeniu. Może ktoś powinien zasugerować twórcom Railsów, że dodanie takiej opcji byłoby dobrym pomysłem.rake
polecenie migracji-tworzenia, z nazwą tabeli jako parametrem, która generowałaby potrzebne funkcjeup
idown
funkcje.Odpowiedzi:
Nie zawsze będziesz w stanie po prostu wygenerować migrację, aby mieć już odpowiedni kod. Możesz utworzyć pustą migrację, a następnie wypełnić ją potrzebnym kodem.
Informacje na temat wykonywania różnych zadań podczas migracji można znaleźć tutaj:
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Mówiąc dokładniej, możesz zobaczyć, jak upuścić tabelę, stosując następujące podejście:
źródło
Najpierw wygeneruj pustą migrację o dowolnej nazwie. Ważne jest, aby zrobić to w ten sposób, ponieważ tworzy on odpowiednią datę.
Spowoduje to wygenerowanie pliku .rb w / db / migrate / like 20111015185025_drop_products_table.rb
Teraz edytuj ten plik, aby wyglądał tak:
Jedyne, co dodałem, to
drop_table :products
iraise ActiveRecord::IrreversibleMigration
.Następnie biegnij,
rake db:migrate
a ona upuści dla ciebie stół.źródło
down
metodzie, nie odzyskasz jej, więc nie jest to właściwe wycofanie. Lepiej wyraźnie wskazać, że migracja jest nieodwracalna, niż dać fałszywe poczucie, że można ją odzyskać.Napisz swoją migrację ręcznie. Np
rails g migration DropUsers
. Biegnij .Jeśli chodzi o kod migracji, zacytuję post Maxwell Holder Rails Migration Checklist
ZŁE - działa,
rake db:migrate
a następnierake db:rollback
zawiedzieDOBRY - ujawnia zamiar, aby migracja nie była odwracalna
LEPSZE - jest w rzeczywistości odwracalne
źródło
schema.rb
, nie zapomnij również poszukaćschema.rb
kluczy obcych. Następnie dodaj definicję klucza obcego dodrop_table
bloku, np .:t.foreign_key "other_table"
Chociaż podane tutaj odpowiedzi działają poprawnie, chciałem czegoś bardziej „prostego”, znalazłem to tutaj: link Najpierw wejdź do konsoli szyn:
Następnie wpisz:
I gotowe, działało dla mnie!
źródło
rails destroy model User
Musisz utworzyć nowy plik migracji za pomocą następującego polecenia
i napisz kod drop_table w nowo wygenerowanym pliku migracji (db /igration / xxxxxxx_drop_table_xyz) jak
Lub jeśli chcesz usunąć tabelę bez migracji, po prostu otwórz konsolę szyn przez
i wykonaj następujące polecenie
lub możesz użyć bardziej uproszczonego polecenia
źródło
źródło
Myślę, że aby być całkowicie „oficjalnym”, musisz utworzyć nową migrację i umieścić drop_table w self.up. Metoda self.down powinna następnie zawierać cały kod, aby odtworzyć tabelę w całości. Przypuszczalnie ten kod można pobrać z pliku schema.rb podczas tworzenia migracji.
Wydaje się to trochę dziwne, aby wprowadzić kod w celu utworzenia tabeli, o której wiesz, że już nie będziesz potrzebować, ale dzięki temu cały kod migracji będzie kompletny i „oficjalny”, prawda?
Zrobiłem to tylko dla stołu, który musiałem upuścić, ale szczerze mówiąc nie przetestowałem „upadku” i nie jestem pewien, dlaczego to zrobię.
źródło
raise ActiveRecord::IrreversibleMigration
w metodzie self.down, abyś w LEAST dał sobie błąd / powiadomienie, jeśli kiedykolwiek spróbujesz wycofać.CreateMyTable.up
iActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, X)
gdzie X to migracja, która pierwotnie utworzyła tabelę, ale żadna z nich nie działa - w obu podejściach AR najpierw sprawdza, czy migracja została już zastosowana, i cicho pomija ją, jeśli ma. `możesz po prostu upuścić stół z konsoli szyn. najpierw otwórz konsolę
następnie wklej to polecenie w konsoli
zamień nazwa_tabeli na tabelę, którą chcesz usunąć.
możesz także upuścić tabelę bezpośrednio z terminala. wystarczy wejść do katalogu głównego aplikacji i uruchomić to polecenie
źródło
Prosty i oficjalny sposób byłby następujący:
Teraz przejdź do db / migrate i poszukaj swojego pliku, który zawiera drop_tablename jako nazwę pliku i edytuj go do tego.
Następnie musisz biec
na twojej konsoli.
źródło
Możesz przywrócić migrację w sposób opisany w przewodniku:
http://guides.rubyonrails.org/active_record_migrations.html#reverting-previous-migrations
Wygeneruj migrację:
Napisz migrację:
W ten sposób możesz także cofnąć i użyć do przywrócenia dowolnej migracji
źródło
Alternatywa dla zgłaszania wyjątku lub próby odtworzenia pustej tabeli - jednocześnie umożliwiając wycofanie migracji, ponawianie itp. -
źródło
Nie byłem w stanie sprawić, by działał ze skryptem migracji, więc zdecydowałem się na to rozwiązanie. Wejdź do konsoli szyn za pomocą terminala:
Rodzaj
To działa dobrze dla mnie. Spowoduje to usunięcie poprzedniej tabeli. Nie zapomnij uruchomić
źródło
Otwórz konsolę szyn
źródło
ActiveRecord::Base.connection.drop_table :table_name
źródło
Musiałem usunąć nasze skrypty migracji oraz same tabele ...
z poziomu okna terminala uruchom:
lub
źródło
najlepszym sposobem na to jest
następnie wykonaj następujące czynności
źródło
Biegać
Gdzie
<version>
jest numer wersji pliku migracji, który chcesz przywrócić.Przykład:-
źródło
jeśli ktoś szuka jak to zrobić w SQL.
wpisz
rails dbconsole
z terminalaWprowadź hasło
W konsoli zrobić
USE db_name;
DROP TABLE table_name;
exit
Nie zapomnij usunąć pliku migracji i struktury tabeli ze schematu
źródło
rails db
jeśli chcesz upuścić określony stół, możesz to zrobić
w przeciwnym razie, jeśli chcesz usunąć całą bazę danych, możesz to zrobić
źródło
Upuść tabelę / migrację
uruchom: - $ szyny generują migrację DropTablename
exp: - $ tory generują migrację DropProducts
źródło
Uruchom to polecenie: -
następnie:
lub jeśli korzystasz z bazy danych MySql:
show databases;
show tables;
drop table_name;
źródło
Jeśli chcesz usunąć tabelę ze schematu, wykonaj poniższą operację -
źródło