it-roy-ru.com

Rails Миграция БД - как удалить таблицу?

Я добавил таблицу, которая, как мне казалось, мне понадобится, но теперь я больше не планирую ее использовать. Как мне удалить эту таблицу?

Я уже запустил миграцию, поэтому таблица находится в моей базе данных. Я думаю, что Rails generate migration должен быть в состоянии справиться с этим, но я еще не понял, как это сделать.

Я пробовал:

Rails generate migration drop_tablename

но это только породило пустую миграцию.

Каков "официальный" способ удаления таблицы в Rails?

469
Jason Whitehorn

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

Вы можете найти информацию о том, как выполнить различные задачи в миграции здесь:

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

Более конкретно, вы можете увидеть, как удалить таблицу, используя следующий подход:

drop_table :table_name
597
Pete

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

Rails generate migration DropProductsTable

Это создаст файл .rb в/db/migrate/like 20111015185025_drop_products_table.rb

Теперь отредактируйте этот файл, чтобы он выглядел так:

class DropProductsTable < ActiveRecord::Migration
  def up
    drop_table :products
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

Единственное, что я добавил, это drop_table :products и raise ActiveRecord::IrreversibleMigration.

Затем запустите rake db:migrate, и он сбросит таблицу для вас.

330
Brandon O'Rourke

Напишите вашу миграцию вручную. Например. запустить Rails g migration DropUsers.

Что касается кода миграции, я просто процитирую пост Максвелла Холдера Контрольный список миграции Rails

BAD - запуск rake db:migrate, а затем rake db:rollback завершится ошибкой

class 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
273
Beder Acosta Borges

Хотя ответы, представленные здесь, работают правильно, я хотел что-то более «простое», но нашел это здесь: ссылка Сначала войдите в консоль Rails:

$Rails console

Затем просто введите:

ActiveRecord::Migration.drop_table(:table_name)

И сделано, работал для меня!

183
lllllll

Вам необходимо создать новый файл миграции, используя следующую команду

Rails generate migration drop_table_xyz

и напишите код drop_table во вновь сгенерированный файл миграции (db /igration/xxxxxxx_drop_table_xyz) как

drop_table :tablename

Или, если вы хотите удалить таблицу без миграции, просто откройте консоль Rails

$ Rails c

и выполните следующую команду

ActiveRecord::Base.connection.execute("drop table table_name")

или вы можете использовать более упрощенную команду

ActiveRecord::Migration.drop_table(:table_name)
35
Shahzad Tariq
  1. Rails г миграции drop_users
  2. Правка миграцию
    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end
  1. грабли дБ: мигрировать
21
Aashish Saini

Я думаю, чтобы быть полностью «официальным», вам нужно создать новую миграцию и поместить drop_table в self.up. Затем метод self.down должен содержать весь код для полного воссоздания таблицы. Предположительно, этот код можно было просто взять из schema.rb во время создания миграции.

Кажется немного странным, вставлять код для создания таблицы, которая, как вы знаете, вам больше не понадобится, но при этом весь код миграции будет полным и «официальным», верно?

Я просто сделал это для стола, который мне нужно было уронить, но, честно говоря, не проверял «вниз» и не знал, почему я это сделаю.

13
Francis Potter

вы можете просто удалить таблицу из консоли Rails . сначала откройте консоль

$ Rails c

затем вставьте эту команду в консоль

ActiveRecord::Migration.drop_table(:table_name)

замените table_name на таблицу, которую вы хотите удалить.

вы также можете удалить таблицу прямо из терминала. просто войдите в корневой каталог вашего приложения и выполните эту команду

$ Rails runner "Util::Table.clobber 'table_name'"
11
Farzpal Singh

Вы можете откатить миграцию так, как она есть в руководстве:

http://guides.rubyonrails.org/active_record_migrations.html#reverting-previous-migrations

Создать миграцию:

Rails generate migration revert_create_tablename

Напишите миграцию:

require_relative '20121212123456_create_tablename'

class RevertCreateTablename < ActiveRecord::Migration[5.0]
  def change
    revert CreateTablename    
  end
end

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

7
Matheus Silva

Откройте консоль Rails

ActiveRecord::Base.connection.execute("drop table table_name")
7
manish nautiyal

Простой и официальный способ будет следующим:

  Rails g migration drop_tablename

Теперь перейдите в db/migrate и найдите свой файл, который содержит имя_папки в качестве имени файла, и отредактируйте его.

    def change
      drop_table :table_name
    end

Тогда вам нужно бежать

    rake db:migrate 

на вашей консоли.

6
Mahesh Mesta

Альтернатива повышению исключения или попытке воссоздать пустую таблицу - при этом все еще включается откат миграции, повтор и т.д. -

def change
  drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end
5
aqwan

ActiveRecord::Base.connection.drop_table :table_name

4
nhegroj

Я не смог заставить его работать со сценарием миграции, поэтому я выбрал это решение. Войдите в консоль Rails, используя терминал:

Rails c

Тип

ActiveRecord::Migration.drop_table(:tablename)

Это хорошо работает для меня. Это удалит предыдущую таблицу. Не забудь бежать

Rails db:migrate
2
Srikanth V

Запустите эту команду: -

Rails g migration drop_table_name

затем:

rake db:migrate

или если вы используете базу данных MySql, то:

  1. войти с базой данных
  2. show databases;
  3. show tables;
  4. drop table_name;
2
Nitin Rakesh

Мне нужно было удалить наши сценарии миграции вместе с самими таблицами ...

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

из окна терминала запустить:

$ Rails runner "Util::Table.clobber 'your_table_name'"

или же

$ Rails runner "Util::Table.clobber_all"
2
Aaron Henderson

лучший способ сделать это 

Rails g migration Drop_table_Users

затем сделайте следующее

rake db:migrate
1
Anoob K Bava

Бежать

rake db:migrate:down VERSION=<version>

Где <version> - это номер версии вашего файла миграции, который вы хотите вернуть.

Пример:-

rake db:migrate:down VERSION=3846656238
1
Rankit Ranjan

Если вы хотите удалить таблицу из схемы, выполните следующие действия:

Rails db:rollback
0
iamnair

если вы хотите удалить конкретную таблицу, вы можете сделать

$ Rails db:migrate:up VERSION=[Here you can insert timestamp of table]

в противном случае, если вы хотите удалить всю свою базу данных, вы можете сделать

$Rails db:drop
0
Nicollas Matheus