У меня есть эта база данных тестирования, которая к настоящему времени заполнена барахлом. Теперь я сделал несколько команд Table.destroy_all в консоли rails, которая удаляет все записи и зависимости, которые являются удивительными. Однако; Я хотел бы усечь все, чтобы идентификатор и т.д. Снова начинался с 1. Есть ли способ в Rails 3?
Усекать стол с помощью консоли рельсов
Ответ 1
Принятый ответ работает только в том случае, если вам нужно воссоздать всю базу данных.
Чтобы удалить отдельную таблицу (с обратными вызовами) и получить идентификаторы для начала с 1:
Model.destroy_all # Only necessary if you want to trigger callbacks.
ActiveRecord::Base.connection.execute("TRUNCATE #{table_name} RESTART IDENTITY")
Если вы используете Sqlite, он не поддерживает усечение, поэтому выполните следующие действия:
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
Просто перестройте базу данных в следующем тестовом прогоне (это произойдет автоматически после ее удаления).
rake db:drop RAILS_ENV=test
Ответ 3
Вы также можете сделать rake db:rollback STEP=3 RAILS_ENV=test
где 3 - количество миграций, которое у вас есть в db/migrate. В примере: Если у меня есть
db/migrate
20140121065542_create_users.rb
20140121065710_create_profiles.rb
20140121065757_create_articles.rb
20140121065900_create_comments.rb
20140121065929_create_categories.rb
Итак, у меня есть всего 5 миграций для удаления. Если я сделаю rake db:rollback STEP=5 RAILS_ENV=test
, все таблицы будут удалены из моей базы данных TEST, и если я удалю RAILS_ENV = test, то все таблицы ENVIRONNMENT (production, test, development) будут удалены, и он очистит также файл db/shema.rb от него данные миграции.
Ответ 4
rake db:reset
выполнит rake db:drop db:setup
. Другими словами, удалите базу данных и настройте базу данных еще раз.
Ответ 5
Это сработало для меня → > ActiveRecord:: Base.connection.execute( "TRUNCATE table_name" )
Ответ 6
Предполагая, что вы используете MySQL или Postgre, а не SQlite3 (который не поддерживает TRUNCATE
), вы можете сделать следующее:
MyModel.connection_pool.with_connection { |c| c.truncate(MyModel.table_name) }
Обратите внимание, что это не вызовет обратные вызовы ActiveRecord.
Ответ 7
(Я немного опоздал на вечеринку)
Просить сделать это в консоли:
2.1.2 :001 > Post.all.each do |post|
2.1.2 :002 > post.destroy!
2.1.2 :003 > end
Работает также...
Это по существу проходит через все сообщения и уничтожает их. Он не меняет ваше значение автоматического увеличения, хотя...
Такая же логика должна работать и для Rails 3 (хотя я использую Rails 4)