Löschen oder erstellen Sie eine Ruby on Rails-Datenbank neu

582

Ich habe eine Ruby on Rails-Entwicklerdatenbank voller Daten. Ich möchte alles löschen und die Datenbank neu erstellen. Ich denke darüber nach, etwas zu verwenden wie:

rake db:recreate

Ist das möglich?

Ein Lehrling
quelle
Ich würde vorschlagen, über die am höchsten bewertete Antwort hinauszuschauen. Meiner Meinung nach rake db:drop db:create db:schema:loadkönnte dies angemessener sein als rake db:drop db:create db:migrate(obwohl ich bereit bin, mich darin zu irren).
Jason Swett
Mögliches Duplikat von Datenbank
zurücksetzen
2
rake db:drop db:create db:migrate
William Hampshire
db:drop + db:create + db:migrate == db:migrate:reset. Normalerweise greife ich zurück db:schema:load, wenn Migrationen unterbrochen sind. Ich muss die Datenbank selten neu erstellen, daher spielt Geschwindigkeit keine große Rolle. Auch wenn Sie nicht angewendete Migrationen haben db:schema:loadund db:resetdiese nicht anwenden. Ich bin mir nicht sicher, ob das ein großes Argument ist.
X-Yuri

Antworten:

1074

Ich kenne zwei Möglichkeiten, dies zu tun:

Dadurch wird Ihre Datenbank zurückgesetzt und Ihr aktuelles Schema mit allen Elementen neu geladen:

rake db:reset db:migrate

Dadurch wird Ihre Datenbank zerstört, erstellt und anschließend das aktuelle Schema migriert:

rake db:drop db:create db:migrate

In beiden Szenarien gehen alle Daten verloren.

thenengah
quelle
36
Es scheint rake db:resetauch alle Migrationen auszuführen (zumindest auf Rails 3), also sollte das alles sein, was benötigt wird, oder?
Plindberg
1
Oder besser gesagt, das Schema bleibt identisch mit dem, was bei allen Migrationen ausgeführt wird. Die Migrationen werden jedoch nicht per se ausgeführt (wenn Sie also Migrationen haben, die Daten einfügen, geschieht dies nicht. Verwenden Sie dazu unbedingt eine Datei db / seeds.rb).
Plindberg
1
Ich weiß, dass für Tracks GTD App db: migrate nicht funktioniert hat. Ich musste db: reset ausführen, als ich von Sqlite3 zu Postgres wechselte.
Labyrinth
11
Sie müssen auch zum rake db:test:prepareTesten ausführen , sonst erhalten Sie eine Fehlermeldung wie:Could not find table 'things' (ActiveRecord::StatementInvalid)
s2t2
31
Jemand sollte das klarstellen rake db:resetund rake db:drop db:create db:migrate zwei ganz verschiedene Dinge tun . Letzterer löscht die gesamte App-Datenbank, erstellt sie neu und durchläuft dann jede Migration, um das Schema ( db/schema.rboder db/structure.sql) zu aktualisieren , füllt es jedoch nicht mit Startdaten. Der erste ist stattdessen ein Alias ​​für rake db:drop db:schema:load db:seed, sodass die gesamte App-Datenbank gelöscht wird, das Schema jedoch nicht aktualisiert wird und dann mit Startdaten gefüllt wird. Wenn Sie also an Ihren Migrationen nichts geändert haben, ist die erste schneller und die zweite sicherer.
Claudio Floreani
157

Auf Schienen 4 ist alles was benötigt wird

$ rake db:schema:load

Dadurch wird der gesamte Inhalt Ihrer Datenbank gelöscht und das Schema aus Ihrer Datei schema.rb neu erstellt, ohne dass alle Migrationen einzeln angewendet werden müssen.

Eneko Alonso
quelle
6
funktioniert auch für Schienen 3. nützlich, wenn Sie gerade Ihre Testdatenbank durcheinander gebracht haben und sie auf eine funktionierende Version zurücksetzen möchten, die Ihrer
Entwickler-
Danke dafür. Ich habe das nicht bemerkt db:dropund db:createwar überflüssig.
Grant Birchmeier
3
Dies aktualisiert das Schema nicht und ist kein sicherer Weg, wenn Sie Ihre Migrationen umgestalten.
Claudio Floreani
Das ist die beste Antwort für mich.
Roxdurazo
2
@ClaudioFloreani Refactoring Migrationen bittet um Ärger. Sobald sie ausgeführt werden, sollten sie dauerhaft in Ruhe gelassen werden.
Nrowegt
45

Ich benutze den folgenden Liner im Terminal.

$ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare

Ich habe dies als Shell-Alias ​​eingefügt und benannt remigrate

Inzwischen können Sie Rails-Aufgaben einfach "verketten":

$ rake db:drop db:create db:migrate db:schema:dump db:test:prepare # db:test:prepare no longer available since Rails 4.1.0.rc1+
TK.
quelle
12
Dadurch werden alle Ihre Migrationen nacheinander ausgeführt, was nicht skalierbar und fehleranfällig ist. Außerdem bin ich mir ziemlich sicher, dass db: migrate Ihre schema.rb aktualisiert, sodass Ihr schema: dump nichts Nützliches tut.
Coreyward
Wie leert man die Datenbank? in der Entwicklung ... alles klar.
AnApprentice
3
@AnApprentice Sie können ausführen db:reset, was nur ein Google (oder überprüfen Sie die Guides ) entfernt ist. Mein Kommentar war nicht, davon abzuraten, sondern zu vermeiden, db:migratewann Sie wirklich wollen db:schema:load.
Coreyward
7
Übrigens, @TK, Sie müssen wirklich nicht alle diese Prozesse als separate Prozesse ausführen, abhängig vom Exit-Status des letzten. Übergeben Sie stattdessen einfach alle gewünschten Aufgaben an rake: rake db:drop db:create db:schema:load.
Coreyward
1
Es ist anekdotisch, aber ich hatte noch nie ein Problem db:migrate... während db:schema:loades empfindlich ist, wenn jemand vergisst, schema.rb neben einer neuen Migration in die Versionskontrolle einzuchecken.
Johncip
37

Update: In Rails 5 kann auf diesen Befehl über diesen Befehl zugegriffen werden:

rails db:purge db:create db:migrate RAILS_ENV=test


Ab der neuesten Version von Rails 4.2 können Sie jetzt Folgendes ausführen:

rake db:purge 

Quelle: Commit

# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
  task :purge => [:load_config] do
    ActiveRecord::Tasks::DatabaseTasks.purge_current
  end

Es kann wie oben erwähnt zusammen verwendet werden:

rake db:purge db:create db:migrate RAILS_ENV=test
Robbie Guilfoyle
quelle
Wie @bekicot im einfacheren Englisch sagt db:purge"entferne alle Daten, aber behalte alle Tabellen und Spalten bei"
MCB
@MCB Ich habe mich geirrt, sory darüber, db:purge die Tabellen nicht zu erhalten.
Yana Agun Siswanto
29

Je nachdem, was Sie wollen, können Sie verwenden ...

rake db:create

… Um die Datenbank von Grund auf neu zu erstellen config/database.ymloder…

rake db:schema:load

… Um die Datenbank von Grund auf aus Ihrer schema.rbDatei zu erstellen.

Coreyward
quelle
1
Sie müssen zuerst die Datenbank löschen ... oder Sie können die Tabellen einfach löschen, wenn Sie dies bevorzugen.
Coreyward
5
+1 für das Laden des Schemas. Manchmal werden Migrationen durcheinander gebracht, aber das Schema sollte das sein, was intakt bleibt.
Danny
Ich habe in The Rails 3 Way gelesen, dass das Laden des Schemas der richtige Weg ist, anstatt alle Migrationen auszuführen. Ich erinnere mich nicht genau, was ihre Argumentation war, aber es scheint sinnvoll zu sein. Wenn das Endergebnis in beiden Fällen dasselbe ist, scheint es einfacher und weniger fehleranfällig zu sein, nur die Datenbank aus dem Schema zu laden, als eine Reihe von Migrationen auszuführen.
Jason Swett
3
Der Grund dafür ist, dass Migrationen Daten migrieren sollen und mit der Zeit immer spröder werden, wenn sich Ihre Modelle ändern. Sie können (und sollten) Modelle mit minimalem Umfang in Ihre Migrationen einbinden, wann immer dies möglich ist, um sicherzustellen, dass sie ausgeführt werden. Dies lässt sich jedoch nicht gut skalieren und ist viel weniger effizient, als nur die Datenbank aus dem zu erstellen, von dem die Anwendung weiß, dass es der letzte Punkt ist . Warum sollten Sie sich auf Migrationen verlassen, um eine Datenbank zu erstellen, die Ihrem Schema ähnelt, wenn Sie nur aus der Blaupause selbst erstellen können?
Coreyward
13

Über die Befehlszeile ausführen

rake db:migrate:reset
user2747051
quelle
Nur so kann die App alle Migrationen erneut ausführen. Da jede Migration nimmt Änderungen an , schema.rbund wenn Sie nur dropund create, migratetut nichts (getestet auf Schienen 6)
Shampoo
12

Verwenden Sie wie

rake db:drop db:create db:migrate db:seed

Alles in einer Zeile. Dies ist schneller, da die Umgebung nicht immer wieder neu geladen wird.

db: fallen lassen - löscht die Datenbank.

db: create - erstellt eine Datenbank (host / db / password wird aus config / database.yml übernommen)

db: migrate - führt vorhandene Migrationen aus dem Verzeichnis aus (db / migration / .rb) * aus.

db: seed - führt die möglichen Seed-Daten aus dem Verzeichnis aus (db / migration / seed.rb) aus .

Normalerweise bevorzuge ich:

rake db:reset

alles auf einmal tun.

Prost!

Manish Shrivastava
quelle
1
Ich mag es, db: test hinzuzufügen: bereite dich darauf vor, für ein gutes Maß. Dies hängt natürlich davon ab, ob Sie testen oder nicht.
CTC
db:reset == db:drop + db:schema:load + db:seed,db:migrate:reset == db:drop + db:create + db:migrate
x-yuri
11

Geben Sie einfach die Reihenfolge der Schritte ein: Löschen Sie die Datenbank, erstellen Sie sie erneut, erstellen Sie Daten, und säen Sie die Datenbank, wenn Sie Seeds haben:

rake db:drop db:create db:migrate db:seed

Da die Standardumgebung für rakeist die Entwicklung , für den Fall , wenn Sie sehen , die Ausnahme in spec Tests, sollten Sie für die neu erstellen db Testumgebung wie folgt:

RAILS_ENV=test rake db:drop db:create db:migrate

In den meisten Fällen wird die Testdatenbank während der Testprozeduren gesät, sodass db:seedkeine Aufgabenaktion übergeben werden muss. Andernfalls müssen Sie die Datenbank vorbereiten:

rake db:test:prepare

oder

RAILS_ENV=test rake db:seed

Um die Aufgabe zum erneuten Erstellen zu verwenden , können Sie Rakefile außerdem den folgenden Code hinzufügen :

namespace :db do
   task :recreate => [ :drop, :create, :migrate ] do
      if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
         Rake::Task[ 'db:seed' ].invoke
      end
   end
end

Dann Ausgabe:

rake db:recreate
Малъ Скрылевъ
quelle
8

Sie können manuell tun:

rake db:drop
rake db:create
rake db:migrate

Oder einfach rake db:reset, was die obigen Schritte ausführt, aber auch Ihredb/seeds.rb Datei ausführt.

Eine zusätzliche Nuance ist, dass rake db:resetdirekt aus Ihrer schema.rbDatei geladen wird, anstatt alle Migrationsdateien erneut auszuführen.

Ihre Daten werden in jedem Fall weggeblasen.

Erik Trautman
quelle
6

Sie können die folgende Befehlszeile verwenden:

rake db:drop db:create db:migrate db:seed db:test:clone
user1358180
quelle
4

Um eine bestimmte Datenbank zu löschen, können Sie dies auf der Rails-Konsole tun:

$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit

Und dann DB erneut migrieren

$bundle exec rake db:migrate 
Kush
quelle
4

Auf Schienen 4.2, um alle Daten zu entfernen, aber die Datenbank beizubehalten

$ bin/rake db:purge && bin/rake db:schema:load

https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md

Yana Agun Siswanto
quelle
Nun ... Ich habe es gerade versucht, aber es werden keine Tabellen und Spalten beibehalten. Sie müssen eine db: migrate ausführen, nachdem Sie eine db: purge ausgeführt haben. Dadurch bleiben Tabellen und Spalten nicht erhalten. Es behält jedoch die Datenbank selbst bei, so dass Sie nicht db: create
Freddo
1
@ Cedric Sie haben Recht, db: Bereinigung bewahrt die Tabelle nicht. Ich habe den Code aktualisiert.
Yana Agun Siswanto
3

Sie können db:reset- für run db: drop und db: setup oder verwenden db:migrate:reset , db: create und db: migrate verwenden.

abhängig von dir willst du exist schema.rb verwenden

Aleksandr Babak
quelle
2

Laut Rails-Handbuch sollte dieser eine Liner verwendet werden, da er schema.rbvon den Migrationsdateien geladen wird, anstatt sie einzeln neu zu laden :

rake db:reset
Sieger
quelle
1

Da Sie in der Entwicklung die Datenbank immer neu erstellen möchten, können Sie eine Rake-Task in Ihrem lib / task-Ordner so definieren.

  namespace :db do
      task :all => [:environment, :drop, :create, :migrate] do
   end 
end

und im Terminal werden Sie laufen

rake db:all

Es wird Ihre Datenbank neu erstellen

Obed Lorisson
quelle
1

Ich denke, der beste Weg, um diesen Befehl auszuführen:

**rake db:reset** it does db:drop, db:setup
 rake db:setup does db:create, db:schema:load, db:seed
Thorin
quelle
1

Einfach kann man rennen

rake db:setup

Es wird die Datenbank löschen, eine neue Datenbank erstellen und die Datenbank aus dem Seed füllen, wenn Sie eine Seed-Datei mit einigen Daten erstellt haben.

Touseef Murtaza
quelle
1

3 Optionen, gleiches Ergebnis:

1. Alle Schritte:

  $ rake db:drop           # deletes the database for the current env
  $ rake db:create         # creates the database for the current env
  $ rake db:schema:load    # loads the schema already generated from schema.rb / erases data
  $ rake db:seed           # seed with initial data

2. Zurücksetzen:

  $ rake db:reset          # drop / schema:load / seed

3. Migrieren: Zurücksetzen:

  $ rake db:migrate:reset  # drop / create / migrate
  $ rake db:seed

Anmerkungen:

  • Wenn schema: load verwendet wird, ist es schneller als alle Migrationen, aber das gleiche Ergebnis.
  • Alle Daten gehen verloren.
  • Sie können mehrere Rechen in einer Linie ausführen.
  • Funktioniert mit Schienen 3.
urko
quelle
0

Ich habe heute einige Änderungen an meinem Schienenschema vorgenommen. Mir wurde klar, dass ich zwei zusätzliche Modelle in einer Hierarchie und einige andere zum Löschen brauchte. An den Modellen und Steuerungen waren viele kleine Änderungen erforderlich.

Ich habe die beiden neuen Modelle hinzugefügt und sie erstellt mit:

rake db:migrate

Dann habe ich die Datei schema.rb bearbeitet. Ich habe die alten Modelle, die nicht mehr benötigt wurden, manuell entfernt, das Fremdschlüsselfeld nach Bedarf geändert und es nur ein wenig neu angeordnet, um es mir klarer zu machen. Ich habe alle Migrationen gelöscht und dann den Build erneut ausgeführt über:

rake db:reset

Es hat perfekt funktioniert. Natürlich müssen alle Daten neu geladen werden. Rails erkannte, dass die Migrationen gelöscht worden waren, und setzte die Hochwassermarke zurück:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
ardochhigh
quelle