2012-11-01 8 views
30

Ich habe diese Testdatenbank, die jetzt mit Müll gefüllt ist. Jetzt habe ich ein paar Table.destroy_all-Befehle in der rails-Konsole ausgeführt, die alle Datensätze und Abhängigkeiten löschen, was großartig ist. Jedoch; Ich möchte alles abschneiden, damit die ID usw. wieder bei 1 beginnt. Gibt es einen Weg in Rails 3?Tabelle (n) mit Schienen trimmen Konsole

Antwort

104

Die akzeptierte Antwort funktioniert nur, wenn Sie die gesamte Datenbank neu erstellen müssen.
Um eine einzelne Tabelle (mit dem Callbacks) fallen und die IDs von 1 bis beginnen zu erhalten:

Model.destroy_all # Only necessary if you want to trigger callbacks. 
ActiveRecord::Base.connection.execute("TRUNCATE #{table_name} RESTART IDENTITY") 

Wenn Sie SQLite verwenden, es nicht unterstützt, so dass die folgenden truncate tun:

Model.destroy_all # Only necessary if you want to trigger callbacks. 
ActiveRecord::Base.connection.execute("Delete from #{table_name}") 
ActiveRecord::Base.connection.execute("DELETE FROM SQLITE_SEQUENCE WHERE name='#{table_name}'") 
+2

Ihre Antwort ist korrekt, wenn eine Tabelle abgeschnitten werden soll (Und ich danke Ihnen dafür) Ich habe Yam Marcovic als Antwort gewählt, weil ich nach "alles" gefragt habe, um abgeschnitten zu werden. – CaptainCarl

+4

Danke für die Abstimmung. Die ganze DB-Anforderung war nicht klar aus der Frage!Nur für die Information, Rake db: drop wird die Datenbank löschen. Wenn Sie nur alle Tabellen abschneiden müssen, können Sie ActiveRecord :: Base.connection.tables.collect {| table_name | ausführen ActiveRecord :: Base.connection.execute ("TRUNCATE # {table_name}"}}. Obwohl es die Callbacks möglicherweise nicht kümmert, denke ich, dass es nicht notwendig ist, da wir alle Tabellen abschneiden. –

+0

destroy_all wird bei jedem Datensatz den Befehl destroy aufrufen, was sich von der Verkürzung der Tabelle unterscheidet. Von Docs: # Zerstört die Datensätze, die + Bedingungen + enthalten, indem jeder # Datensatz instanziiert und seine Methode + destroy + aufgerufen wird. Die Rückrufe jedes Objekts sind # ausgeführt (einschließlich : abhängig Assoziationsoptionen und # + before_destroy +/+ after_destroy + Observer-Methoden). Gibt die # Sammlung von Objekten zurück, die zerstört wurden; Jeder wird eingefroren, zu # reflektieren, dass keine Änderungen vorgenommen werden sollten (da sie nicht # dauerhaft sein können). – justingordon

3

Erstellen Sie die Datenbank beim nächsten Testlauf einfach neu (dies geschieht automatisch nach dem Löschen).

rake db:drop RAILS_ENV=test

3

Sie könnten auch rake db:rollback STEP=3 RAILS_ENV=test

tun, wobei 3 die Anzahl der Migrationen darstellt, die Sie in db/migrate haben. Im Beispiel: Wenn ich in

habe
db/migrate 
20140121065542_create_users.rb 
20140121065710_create_profiles.rb 
20140121065757_create_articles.rb 
20140121065900_create_comments.rb 
20140121065929_create_categories.rb 

Also habe ich insgesamt 5 Migrationen zu entfernen. Wenn ich rake db:rollback STEP=5 RAILS_ENV=test mache, werden alle Tabellen aus meiner TEST-Datenbank gelöscht, und wenn ich RAILS_ENV = test lösche, werden alle ENVIRONNMENT-Tabellen (Produktion, Test, Entwicklung) gelöscht und es wird auch die db/shema.rb-Datei aus ihren Migrationsdaten bereinigt .

2

rake db:reset wird rake db:drop db:setup durchführen. Mit anderen Worten: Löschen Sie die Datenbank und richten Sie die Datenbank erneut ein.

Source

+0

Dadurch verlieren wir wichtige Daten, sehr nicht empfohlen. –

0

(Ein bisschen spät, um die Partei, ich weiß)

Vorstellung dies in der Konsole zu tun:

2.1.2 :001 > Post.all.each do |post| 
2.1.2 :002 > post.destroy! 
2.1.2 :003 > end 

funktioniert auch ...

Diese durchläuft im Wesentlichen alle Beiträge und zerstört sie. Es ändert Wert Ihrer Autoinkrement obwohl nicht ...

gleiche Logik soll 3 als auch für Rails arbeiten (obwohl ich Rails benutze 4)

+2

1. Verwenden Sie 'each' nicht, verwenden Sie' find_each'. Es stellt sicher, dass Sie nicht eine Milliarde Datensätze in einer Abfrage erhalten 2. Verwenden Sie nicht die Schleife, wenn Sie nur die Datensätze aus der DB löschen müssen (ohne Callbacks auszuführen). Mach einfach 'Post.delete_all' – Kukunin

4

Das ist für mich gearbeitet >>> Activerecord :: Base. Connection.Execute ("TRUNCATE table_name")

1

Angenommen, Sie sind mit MySQL oder Postgre und nicht sqlite3 (was nicht TRUNCATE nicht unterstützt), können Sie wie folgt vorgehen:

MyModel.connection_pool.with_connection { |c| c.truncate(MyModel.table_name) } 

Beachten Sie, dass dies würde ActiveRec nicht aufrufen ord Rückrufe.