Rake задача для усечения всех таблиц в Rails 3 - PullRequest
16 голосов
/ 13 октября 2011

Я бы хотел получить грабли для усечения всех таблиц. Я нашел один в Интернете, но он предназначен только для Rails 2 и не работает для Rails 3 (проблема в получении соединения с базой данных).

rake db:reset не вариант, потому что я использую PostgreSQL, и он также удаляет пользователя. Поэтому миграция не удалась. Я только хочу очистить данные.

Ребята, у вас есть что-нибудь для меня?

Ответы [ 6 ]

34 голосов
/ 03 октября 2012

Я нашел это через Google, и затем я нашел намного более простое решение, чем одобренное, поэтому вот оно: Используйте database_cleaner gem. Вот шаги.

В вашем Gemfile (выполнить связку после изменения):

gem 'database_cleaner' # you might want to limit this to the dev and staging group

С этим гемом оператор DatabaseCleaner.clean_with :truncation будет обрезать базу данных. Добавление его в задачу rake тривиально:

# tasks/db/clean.rake

namespace :db do

  desc "Truncate all existing data"
  task :truncate => "db:load_config" do
    DatabaseCleaner.clean_with :truncation
  end

end

Вот и все. Вы также можете напрямую использовать строку DatabaseCleaner.clean_with :truncation внутри файла db/seeds.rb, чтобы не забыть обрезать базу данных перед заполнением.

19 голосов
/ 17 октября 2011

Итак, я отредактировал связанный пример в этом:

namespace :db do
  desc "Truncate all existing data"
  task :truncate => "db:load_config" do
   begin
    config = ActiveRecord::Base.configurations[::Rails.env]
    ActiveRecord::Base.establish_connection
    case config["adapter"]
      when "mysql", "postgresql"
        ActiveRecord::Base.connection.tables.each do |table|
          ActiveRecord::Base.connection.execute("TRUNCATE #{table}")
        end
      when "sqlite", "sqlite3"
        ActiveRecord::Base.connection.tables.each do |table|
          ActiveRecord::Base.connection.execute("DELETE FROM #{table}")
          ActiveRecord::Base.connection.execute("DELETE FROM sqlite_sequence where name='#{table}'")
        end                                                                                                                               
       ActiveRecord::Base.connection.execute("VACUUM")
     end
    end
  end
end

Этот пример основан на приведенном ниже коде Криса Леде (спасибо) и работает с Rails 3.X .

Спасибо за все подсказки.

10 голосов
/ 13 октября 2011

Согласно ответу Криса Леде, это становится намного проще:

ActiveRecord::Base.connection.tables.each do |table|
    ActiveRecord::Base.connection.execute("TRUNCATE TABLE #{table};")
end
6 голосов
/ 16 ноября 2012

Вы всегда можете перейти на версию 0, например, так:

rake db:migrate VERSION=0

Таким образом, вам даже не нужно обрезать свои таблицы, и вы можете выполнить миграцию снова.Единственный улов в том, что вам нужно, чтобы ваши миграции down работали правильно.

Это решение работает в рельсах 3, несмотря на тот факт, что версии основаны на отметках времени.

Это решение выглядит так: https://stackoverflow.com/a/1196822/241367

Кроме того, вы всегда можете выполнить следующее, если ваш schema.rb обновлен:

rake db:schema:load

И как @Кикито предлагает, вы можете запустить database_cleaner (это то, что cucumber и rspec нравится использовать между тестами) примерно так:

DatabaseCleaner.clean_with :truncation
3 голосов
/ 13 октября 2011

Это позволит получить все таблицы в вашей базе данных, найти модель, связанную с этой таблицей, и вызвать # destroy_all .

tables = ActiveRecord::Base.connection.tables
tables.each do |tbl|
 # "users" => User
 tbl.classify.constantize.destroy_all
end
1 голос
/ 25 августа 2016

Ответ, данный lzap, имеет одну конкретную проблему. Rails хочет снова запустить все миграции. Следующий код соответствует предложению Энтони Альберто, и он работает. Это дополнение сверяется с таблицей schema_migrations

namespace :db do
  desc "Truncate all existing data"
  task :truncate => "db:load_config" do
   begin
    config = ActiveRecord::Base.configurations[::Rails.env]
    ActiveRecord::Base.establish_connection
    case config["adapter"]
      when "mysql", "postgresql"
        ActiveRecord::Base.connection.tables.each do |table|
          ActiveRecord::Base.connection.execute("TRUNCATE #{table}") if table != "schema_migrations"
        end
      when "sqlite", "sqlite3"
        ActiveRecord::Base.connection.tables.each do |table|
          ActiveRecord::Base.connection.execute("DELETE FROM #{table}") if table != "schema_migrations"
          ActiveRecord::Base.connection.execute("DELETE FROM sqlite_sequence where name='#{table}'") if table != "schema_migrations"
        end                                                                                                                               
       ActiveRecord::Base.connection.execute("VACUUM")
     end
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...