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
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}'")
Erstellen Sie die Datenbank beim nächsten Testlauf einfach neu (dies geschieht automatisch nach dem Löschen).
rake db:drop RAILS_ENV=test
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
habedb/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 .
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.
Dadurch verlieren wir wichtige Daten, sehr nicht empfohlen. –
(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)
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
Das ist für mich gearbeitet >>> Activerecord :: Base. Connection.Execute ("TRUNCATE table_name")
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.
- 1. Schreiben an Schienen-Konsole
- 2. Rails3 irb Konsole gegen Schienen Konsole?
- 3. Schienen Konsole läuft nicht?
- 4. Schienen Migration Skript VS Konsole
- 5. Schienen Konsole lädt nicht
- 6. hebeln-Schienen nicht Schienen Konsole mit Rails 4.0
- 7. Schienen 4 Konsole mit Feder verriegelt
- 8. Wie Assoziationen von Schienen Konsole
- 9. N + 1 Abfrage mit Schienen polymorphe Zuordnung
- 10. Schienen Server und Konsole nicht
- 11. Wie Trimmen mit Entity Framework zu trimmen?
- 12. keine Datenbankverbindung in Schienen Konsole
- 13. Eingabe 'Schienen Konsole' startet nicht?
- 14. Schienen N + 1 wegen .joins?
- 15. Wie kann ich eine Spalte aus der Tabelle entfernen mit Schienen Konsole
- 16. Trimmen der führenden n Alpha-Zeichen aus der Zeichenfolge
- 17. Drucken auf der Konsole (Schienen s)
- 18. Django Restframework N zu N Tabelle
- 19. Löschen Sie alle in Schienen Konsole
- 20. Schienen: Auf Seite drucken, nicht zur Konsole?
- 21. Entfernen Sie n Zeichen aus der Konsole
- 22. Wie einfach n-zu-n-Verbindung in Schienen zu verbinden?
- 23. Schienen - Umleiten Konsole Ausgabe in eine Datei
- 24. Schienen Activerecord in der Konsole finden
- 25. Ausfahrt Schienen Konsole nach langer Ausgabe
- 26. .irbrc Datei nicht von Schienen geladen Konsole
- 27. eine Join-Tabelle mit für Schienen select_tag
- 28. AudioQueue Trimmen und Puffergröße
- 29. Trimmen eingefügten Wert mit JavaScript
- 30. Trimmen von Zahlen mit PHP
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
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. –
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