Rails DB Migration-Как удалить таблицу?

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

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

Я пробовал:
rails generate migration drop_tablename,
но это только породило пустую миграцию.

Что такое "официальный" способ бросить стол в Rails?

19 ответов


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

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

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

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

drop_table :table_name

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

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 и она бросит тебя.


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

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

плохо работает 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

в то время как ответы, представленные здесь, работают правильно, я хотел чего-то более "простого", я нашел его здесь: ссылке Сначала введите консоль rails:

$rails console

потом просто типа:

ActiveRecord::Migration.drop_table(:table_name)

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


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

rails generate migration drop_table_xyz

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

drop_table :tablename

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

$ rails c

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

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

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

ActiveRecord::Migration.drop_table(:table_name)

  1. rails G миграция drop_users
  2. изменить миграционную
    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end
  1. rake db: migrate

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

Это кажется немного странным, ввести код для создания таблицы, которую вы знаете, что вам больше не понадобится, но это сохранит весь миграционный код полным и " официальным", правильно?

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


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

$ rails c

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

ActiveRecord::Migration.drop_table(:table_name)

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

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

$ rails runner "Util::Table.clobber 'table_name'"

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

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

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

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

таким образом, вы также можете откатить и использовать для возврата любой миграции


простой и официальный способ будет так:

  rails g migration drop_tablename

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

    def change
      drop_table :table_name
    end

до

    rake db:migrate 

на консоли.


ActiveRecord::Base.connection.drop_table :table_name


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

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


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

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"

выполните эту команду:-

rails g migration drop_table_name

затем:

rake db:migrate

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

  1. логин с базой данных
  2. show databases;
  3. show tables;
  4. drop table_name;

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

rails g migration Drop_table_Users

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

rake db:migrate

выполнить

rake db:migrate:down VERSION=<version>

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

пример:

rake db:migrate:down VERSION=3846656238

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

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

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

$rails db:drop

Drop Table / Migration

выполнить:- $ rails генерирует миграцию DropTablename

exp: - $ rails генерирует миграционные DropProducts