Ich fügte einen Tisch hinzu, von dem ich dachte, dass ich ihn brauchen würde, aber jetzt habe ich nicht mehr vor, ihn zu benutzen. Wie soll ich den Tisch entfernen?
Ich habe bereits Migrationen ausgeführt, die Tabelle befindet sich also in meiner Datenbank. Ich denke, Rails generate migration
sollte damit umgehen können, aber ich habe noch nicht herausgefunden, wie.
Ich habe es versucht:
Rails generate migration drop_tablename
aber das erzeugte nur eine leere Migration.
Was ist der "offizielle" Weg, einen Tisch in Rails fallen zu lassen?
Sie können die Migration nicht immer einfach so generieren, dass der gewünschte Code bereits vorhanden ist. Sie können eine leere Migration erstellen und sie mit dem Code füllen, den Sie benötigen.
Informationen zum Ausführen verschiedener Aufgaben in einer Migration finden Sie hier:
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Genauer gesagt können Sie sehen, wie Sie eine Tabelle mit dem folgenden Ansatz löschen:
drop_table :table_name
Erstellen Sie zunächst eine leere Migration mit einem beliebigen Namen. Es ist wichtig, dies auf diese Weise zu tun, da das entsprechende Datum erstellt wird.
Rails generate migration DropProductsTable
Dadurch wird eine .rb-Datei in/db/migrate/wie 20111015185025_drop_products_table.rb generiert
Bearbeiten Sie diese Datei jetzt 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
und raise ActiveRecord::IrreversibleMigration
.
Führen Sie dann rake db:migrate
aus, und die Tabelle wird für Sie gelöscht.
Schreiben Sie die Migration manuell. Z.B. Rails g migration DropUsers
ausführen.
Was den Code der Migration angeht, zitiere ich einfach den Beitrag von Maxwell Holder Rails Migration Checkliste
rake db:migrate
und dann rake db:rollback
schlagen fehlclass DropUsers < ActiveRecord::Migration
def change
drop_table :users
end
end
class DropUsers < ActiveRecord::Migration
def up
drop_table :users
end
def down
fail ActiveRecord::IrreversibleMigration
end
end
class DropUsers < ActiveRecord::Migration
def change
drop_table :users do |t|
t.string :email, null: false
t.timestamps null: false
end
end
end
Während die hier bereitgestellten Antworten richtig funktionieren, wollte ich etwas "unkomplizierter", aber ich habe es hier gefunden: link Zuerst geben Sie die Rails-Konsole ein:
$Rails console
Dann tippen Sie einfach:
ActiveRecord::Migration.drop_table(:table_name)
Und fertig, für mich gearbeitet!
Sie müssen mit dem folgenden Befehl eine neue Migrationsdatei erstellen
Rails generate migration drop_table_xyz
und schreibe drop_table-Code in eine neu generierte Migrationsdatei (db/migration/xxxxxxx_drop_table_xyz)
drop_table :tablename
Wenn Sie die Tabelle ohne Migration löschen möchten, öffnen Sie einfach die Rails-Konsole über
$ Rails c
und folgenden Befehl ausführen
ActiveRecord::Base.connection.execute("drop table table_name")
oder Sie können einen vereinfachten Befehl verwenden
ActiveRecord::Migration.drop_table(:table_name)
class DropUsers < ActiveRecord::Migration
def change
drop_table :users do |t|
t.string :name
t.timestamps
end
end
end
Um ganz "offiziell" zu sein, müsste man eine neue Migration erstellen und drop_table in self.up. Die self.down-Methode sollte dann den gesamten Code enthalten, um die Tabelle vollständig neu zu erstellen. Vermutlich kann dieser Code zum Zeitpunkt der Erstellung der Migration nur aus schema.rb entnommen werden.
Es erscheint ein wenig seltsam, wenn Sie Code einfügen, um eine Tabelle zu erstellen, von der Sie wissen, dass Sie sie nicht mehr benötigen werden, aber das würde den gesamten Migrationscode vollständig und "offiziell" halten, oder?
Ich habe das nur für einen Tisch getan, den ich fallen lassen musste, aber ehrlich gesagt nicht das "down" getestet und nicht sicher, warum ich das tun würde.
sie können einfach einen Tisch von der Rails-Konsole löschen Öffnen Sie zunächst die Konsole
$ Rails c
fügen Sie dann diesen Befehl in die Konsole ein
ActiveRecord::Migration.drop_table(:table_name)
ersetzen Sie table_name mit der Tabelle, die Sie löschen möchten.
sie können die Tabelle auch direkt vom Terminal löschen. Geben Sie einfach das Stammverzeichnis Ihrer Anwendung ein und führen Sie diesen Befehl aus
$ Rails runner "Util::Table.clobber 'table_name'"
Sie können eine Migration so rückgängig machen, wie es im Handbuch beschrieben wird:
http://guides.rubyonrails.org/active_record_migrations.html#reverting-previous-migrations
Generieren Sie eine Migration:
Rails generate migration revert_create_tablename
Schreiben Sie die Migration:
require_relative '20121212123456_create_tablename'
class RevertCreateTablename < ActiveRecord::Migration[5.0]
def change
revert CreateTablename
end
end
Auf diese Weise können Sie auch ein Rollback ausführen und jede Migration rückgängig machen
Öffnen Sie Ihre Rails-Konsole
ActiveRecord::Base.connection.execute("drop table table_name")
Der einfache und offizielle Weg wäre folgender:
Rails g migration drop_tablename
Gehen Sie nun zu db/migrate und suchen Sie nach Ihrer Datei, die den Namen drop_tablename als Dateinamen enthält, und bearbeiten Sie diesen.
def change
drop_table :table_name
end
Dann musst du laufen
rake db:migrate
auf deiner Konsole.
Alternative zur Ausnahmebedingung oder zum Versuch, eine jetzt leere Tabelle erneut zu erstellen - und gleichzeitig das Rollback der Migration, das Wiederherstellen von Optionen usw. zu aktivieren -
def change
drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end
ActiveRecord::Base.connection.drop_table :table_name
Ich konnte es nicht mit einem Migrationsskript zum Laufen bringen, also habe ich diese Lösung übernommen. Rufen Sie die Rails-Konsole über das Terminal auf:
Rails c
Art
ActiveRecord::Migration.drop_table(:tablename)
Es funktioniert gut für mich. Dadurch wird die vorherige Tabelle entfernt. Vergiss nicht zu laufen
Rails db:migrate
Führen Sie diesen Befehl aus: -
Rails g migration drop_table_name
dann:
rake db:migrate
oder wenn Sie die MySql-Datenbank verwenden, dann:
show databases;
show tables;
drop table_name;
Ich musste unsere Migrationsskripte zusammen mit den Tabellen selbst löschen ...
class Util::Table < ActiveRecord::Migration
def self.clobber(table_name)
# drop the table
if ActiveRecord::Base.connection.table_exists? table_name
puts "\n== " + table_name.upcase.cyan + " ! "
<< Time.now.strftime("%H:%M:%S").yellow
drop_table table_name
end
# locate any existing migrations for a table and delete them
base_folder = File.join(Rails.root.to_s, 'db', 'migrate')
Dir[File.join(base_folder, '**', '*.rb')].each do |file|
if file =~ /create_#{table_name}.rb/
puts "== deleting migration: " + file.cyan + " ! "
<< Time.now.strftime("%H:%M:%S").yellow
FileUtils.rm_rf(file)
break
end
end
end
def self.clobber_all
# delete every table in the db, along with every corresponding migration
ActiveRecord::Base.connection.tables.each {|t| clobber t}
end
end
vom Terminalfensterlauf:
$ Rails runner "Util::Table.clobber 'your_table_name'"
oder
$ Rails runner "Util::Table.clobber_all"
der beste Weg, den Sie tun können, ist
Rails g migration Drop_table_Users
dann machen Sie folgendes
rake db:migrate
Lauf
rake db:migrate:down VERSION=<version>
Dabei ist <version>
die Versionsnummer Ihrer Migrationsdatei, die Sie zurücksetzen möchten.
Beispiel:-
rake db:migrate:down VERSION=3846656238
Wenn Sie die Tabelle aus dem Schema löschen möchten, führen Sie die folgende Operation aus:
Rails db:rollback
wenn jemand sucht, wie man es in SQL macht.
geben Sie im Terminal Rails dbconsole
ein
passwort eingeben
In der Konsole zu tun
USE db_name;
DROP TABLE table_name;
exit
Bitte vergessen Sie nicht, die Migrationsdatei und die Tabellenstruktur aus dem Schema zu entfernen
wenn Sie eine bestimmte Tabelle löschen möchten, können Sie dies tun
$ Rails db:migrate:up VERSION=[Here you can insert timestamp of table]
andernfalls können Sie die gesamte Datenbank löschen
$Rails db:drop