584 Stimmen

Rails DB Migration - Wie kann man eine Tabelle löschen?

Ich habe eine Tabelle hinzugefügt, von der ich dachte, dass ich sie brauche, die ich jetzt aber nicht mehr verwenden möchte. Wie sollte ich diese Tabelle entfernen?

Ich habe bereits Migrationen durchgeführt, die Tabelle befindet sich also in meiner Datenbank. Ich denke rails generate migration sollte in der Lage sein, dies zu handhaben, aber ich habe noch nicht herausgefunden, wie.

Ich habe es versucht:

rails generate migration drop_tablename

aber das hat nur eine leere Migration erzeugt.

Was ist der "offizielle" Weg zum Löschen einer Tabelle in Rails?

1 Stimmen

Desde rails generate migration über Befehlszeilenoptionen für die Generierung von Migrationscode zum Erstellen von Tabellen, Hinzufügen oder Ändern von Spalten usw. verfügt, wäre es schön, wenn es auch eine Option zum Löschen einer Tabelle gäbe - aber das ist nicht der Fall. Sicher, das Schreiben der up Teil ist einfach - rufen Sie einfach drop_table -- aber die down Teil, die Neuerstellung der Tabelle, ist nicht immer so einfach, vor allem wenn das Schema der betreffenden Tabelle nach ihrer ursprünglichen Erstellung durch Migrationen geändert wurde. Vielleicht sollte jemand den Entwicklern von Rails vorschlagen, dass es eine gute Idee wäre, eine solche Option hinzuzufügen.

5 Stimmen

@TeemuLeisti Wie wäre es, wenn Sie einfach die aktuelle Tabellendefinition aus schema.rb kopieren und einfügen? Ich mache das immer so...

1 Stimmen

@João Soares: OK, ich denke, das funktioniert. Es wäre jedoch schön, wenn der Prozess automatisiert werden könnte, so dass man einfach eine rake Migrationserstellungsbefehl, mit dem Namen einer Tabelle als Parameter, der die benötigten up y down Funktionen.

712voto

Pete Punkte 17557

Sie werden nicht immer in der Lage sein, die Migration einfach so zu erstellen, dass der gewünschte Code bereits vorhanden ist. Sie können eine leere Migration erstellen und sie dann mit dem gewünschten Code füllen.

Hier finden Sie Informationen darüber, wie Sie die verschiedenen Aufgaben bei einer Migration durchführen können:

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

Genauer gesagt, können Sie sehen, wie Sie eine Tabelle mit dem folgenden Ansatz löschen können:

drop_table :table_name

3 Stimmen

Das hat bei mir auch funktioniert. Aber bei vollständigen Migrationen (Installation von Grund auf) wird die Tabelle nun zunächst erstellt und später wieder gelöscht. Ist es sicher, die "Create and Drop"-Migrationen später wieder zu entfernen?

1 Stimmen

Wenn keine andere Migration diese Tabelle verwendet (Hinzufügen/Entfernen von Spalten, Anpassen von Spaltenattributen usw.), schadet es vielleicht nicht, die Create/Drop-Migrationen zu entfernen. Ich bin mir jedoch nicht sicher, ob das Entfernen dieser Migrationen zu nennenswerten Verbesserungen führen wird. Gibt es einen bestimmten Grund dafür, dass Sie sie entfernen möchten?

3 Stimmen

Haben Sie eine Meinung dazu, ob es besser ist, Tabellen zu löschen oder zu einem früheren Datenbankschema zurückzukehren?

398voto

Schreiben Sie Ihre Migration manuell. Führen Sie z. B. rails g migration DropUsers .

Was den Code der Migration betrifft, so zitiere ich einfach Maxwell Holders Beitrag Rails Migration Checkliste

BAD - laufend rake db:migrate und dann rake db:rollback wird scheitern

class DropUsers < ActiveRecord::Migration
  def change
    drop_table :users
  end
end

GUT - zeigt die Absicht, dass die Migration nicht umkehrbar sein sollte

class DropUsers < ActiveRecord::Migration
  def up
    drop_table :users
  end

  def down
    fail ActiveRecord::IrreversibleMigration
  end
end

BETTER - ist tatsächlich umkehrbar

class DropUsers < ActiveRecord::Migration
  def change
    drop_table :users do |t|
      t.string :email, null: false
      t.timestamps null: false
    end
  end
end

9 Stimmen

Wenn Sie ausschneiden und in den Block einfügen von schema.rb vergessen Sie nicht, auch zu suchen schema.rb für Fremdschlüssel. Fügen Sie dann die Fremdschlüsseldefinition in die drop_table Block, z.B.: t.foreign_key "other_table"

2 Stimmen

Ich habe die 3. Option verwendet und es hat bei mir einwandfrei funktioniert. Ich danke Ihnen.

0 Stimmen

Danke @Beder Acosta Borges Ich hatte mich schon gefragt, wie man die Migration richtig durchführt, wenn sie umkehrbar ist. In meinem Fall ging es darum, 2 Tabellen zu entfernen, die nicht benötigt wurden. Also habe ich die Migration generiert und den Inhalt aus der ursprünglichen Migration kopiert und create_table in drop_table geändert, aber den do |t|-Block mit allen Spalten belassen und es hat perfekt funktioniert! TY!

380voto

Brandon O'Rourke Punkte 23305

Erstellen Sie zunächst eine leere Migration mit einem beliebigen Namen. Es ist wichtig, dies auf diese Weise zu tun, da auf diese Weise das entsprechende Datum erstellt wird.

rails generate migration DropProductsTable

Dies erzeugt eine .rb-Datei in /db/migrate/ wie 20111015185025_drop_products_table.rb

Bearbeiten Sie diese Datei nun so, dass sie wie folgt aussieht:

class DropProductsTable < ActiveRecord::Migration
  def up
    drop_table :products
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

Das einzige, was ich hinzugefügt habe, war drop_table :products y raise ActiveRecord::IrreversibleMigration .

Dann laufen rake db:migrate und es wird die Tabelle für Sie löschen.

17 Stimmen

Eine Abwärtsmigration sollte verwendet werden, um die zu löschende Tabelle neu zu erstellen.

2 Stimmen

Diese Umstellung kann nicht mehr rückgängig gemacht werden, auch nicht in der Entwicklungsphase. Wäre es besser, die Abwärtsmigration einfach leer zu lassen?

1 Stimmen

Dies ist die bessere Antwort + der Kommentar von fflyer

219voto

lllllll Punkte 4517

Warnung : Dies geschieht auf eigene Gefahr, da @ z-atef und @ nzifnab Rails wird von diesen Änderungen nichts mitbekommen, Ihre Migrationssequenz wird fehlschlagen und Ihr Schema wird sich von dem Ihrer Kollegen unterscheiden. Dies ist als eine Ressource für lokal basteln mit der Entwicklung nur gemeint.


Die hier gegebenen Antworten funktionieren zwar, aber ich wollte etwas "Einfacheres", und das habe ich hier gefunden: Link Geben Sie zunächst die Schienenkonsole ein:

$rails console

Dann tippen Sie einfach:

ActiveRecord::Migration.drop_table(:table_name)

Und fertig, hat bei mir funktioniert!

0 Stimmen

Das Modell ist noch da, bis Sie die Funktion rails destroy model User

3 Stimmen

Führen Sie dies nur durch, wenn Sie den Tisch für immer loswerden wollen. Rails wird von diesem Drop nichts mitbekommen. Die Migration ist nach der Ausführung dieses Befehls unterbrochen. Kann nicht CREATE, DROP...ETC. ERROR SQLite3::SQLException: no such table: accruals: DROP TABLE "sometable"

0 Stimmen

WARNUNG: TUN SIE DIES NICHT. Sie sollten niemals DDL-Operationen an Ihrer Datenbank direkt von der Konsole aus durchführen. Ihre Strukturdatei hat keine Ahnung, dass diese Änderung vorgenommen wurde, die Entwicklungsumgebungen Ihrer Mitarbeiter unterscheiden sich von Ihrer eigenen und von der Produktionsumgebung, es ist einfach ein Chaos. Verwenden Sie Migrationen.

38voto

Shahzad Tariq Punkte 2667

Sie müssen eine neue Migrationsdatei mit folgendem Befehl erstellen

rails generate migration drop_table_xyz

und schreiben Sie den drop_table-Code in die neu erstellte Migrationsdatei (db/migration/xxxxxxx_drop_table_xyz) wie folgt

drop_table :tablename

Oder wenn Sie die Tabelle ohne Migration löschen möchten, öffnen Sie einfach die Rails-Konsole mit

$ rails c

und führen Sie folgenden Befehl aus

ActiveRecord::Base.connection.execute("drop table table_name")

oder Sie können einen vereinfachten Befehl verwenden

ActiveRecord::Migration.drop_table(:table_name)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X