web-dev-qa-db-ja.com

Rails DBの移行 - テーブルを削除する方法

私が必要とするテーブルを追加しましたが、今はもう使用する予定はありません。そのテーブルを削除するにはどうすればいいですか。

私はすでに移行を実行しているので、テーブルは私のデータベースにあります。私はRails generate migrationがこれを処理できるはずだと思います、しかし私はまだどのように考え出していません。

私はもう試した:

Rails generate migration drop_tablename

しかし、それは空の移行を生み出しただけです。

Railsにテーブルをドロップするための「公式の」方法は何ですか?

465
Jason Whitehorn

あなたがいつもあなたが望むコードを既に持っているために単にマイグレーションを生成することができるというわけではありません。空の移行を作成してから、必要なコードを追加することができます。

マイグレーションでさまざまなタスクを実行する方法についての情報は、こちらにあります。

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

具体的には、次の方法でテーブルを削除する方法を確認できます。

drop_table :table_name
605
Pete

まず、好きな名前で空の移行を生成します。適切な日付が作成されるため、このようにすることが重要です。

Rails generate migration DropProductsTable

20111015185025_drop_products_table.rbのように/ db/migrate /に.rbファイルが生成されます。

そのファイルを次のように編集します。

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

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

私が追加した唯一のものはdrop_table :productsraise ActiveRecord::IrreversibleMigrationです。

それからrake db:migrateを実行すると、それはあなたのためにテーブルを削除します。

333

手動で移行を書きます。例えば。 Rails g migration DropUsersを実行してください。

移行のコードに関しては、Maxwell Holderの記事 Rails Migration Checklist を引用するつもりです。

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
282

ここで提供されている答えは正しく機能していますが、もう少し「わかりやすい」ものを望んでいました。 link まずRailsコンソールに入ります。

$Rails console

それからちょうどタイプしなさい:

ActiveRecord::Migration.drop_table(:table_name)

そしてやった、私のために働いた!

185
lllllll

次のコマンドを使用して新しい移行ファイルを作成する必要があります。

Rails generate migration drop_table_xyz

そして新しく生成された移行ファイル(db/migration/xxxxxxx_drop_table_xyz)にdrop_tableコードを書きます。

drop_table :tablename

移行せずにテーブルを削除したい場合は、単にRailsコンソールを開いてください。

$ Rails c

次のコマンドを実行してください

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

もっと単純なコマンドを使うこともできます

ActiveRecord::Migration.drop_table(:table_name)
35
Shahzad Tariq
  1. Gマイグレーションdrop_usersをレールします。
  2. 移行を編集する
    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end
  1. レーキdb:migrate
21
Aashish Saini

私は、完全に「公式」になるためには、新しい移行を作成し、そしてdrop_tableをself.upに入れる必要があると思います。 self.downメソッドには、テーブル全体を再作成するためのすべてのコードが含まれているはずです。おそらく、そのコードは、マイグレーションを作成した時点でschema.rbから取得されたものに過ぎません。

もう必要ないと思うテーブルを作成するためにコードを入れるのは少し奇妙に思えますが、それはすべての移行コードを完成させ、「公式」に保つでしょうね。

ドロップする必要があるテーブルに対してこれを実行しただけですが、 "down"をテストしていないため、なぜ実行するのかわかりません。

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に行き、ファイル名としてdrop_tablenameを含んでいるあなたのファイルを探して、これに編集してください。

    def change
      drop_table :table_name
    end

それならあなたは走る必要があります

    rake db:migrate 

あなたのコンソールで。

6
Mahesh Mesta

移行ロールバック、REDOなどを有効にしたまま、例外を発生させたり、現在空の表を再作成しようとしたりする代わりに -

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
3
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

誰かがSQLでそれを行う方法を探している場合。

端末からRails dbconsoleと入力します

パスワードを入力する

コンソールで

USE db_name;

DROP TABLE table_name;

exit

スキーマから移行ファイルとテーブル構造を削除することを忘れないでください

0
Shan

特定のテーブルを削除したい場合は、できます。

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

それ以外の場合はあなたがあなたのできるすべてのあなたのデータベースを削除したい場合

$Rails db:drop
0