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


507

必要になると思ったテーブルを追加しましたが、現在は使用する予定はありません。そのテーブルを削除するにはどうすればよいですか?

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

私はもう試した:

rails generate migration drop_tablename

しかし、それは空のマイグレーションを生成しました。

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


1
のでrails generate migrationそれはない-など、列を追加または変更、テーブルを作成するための移行コードを生成するためのコマンドラインオプションを持っている、それはまた、テーブルをドロップするためのオプションを持っていた場合、それはいいだろう。確かに、up部分の記述は単純です-呼び出すだけですdrop_table-しかし、down表を再度生成する部分は、特に問題の表のスキーマが最初の作成後に移行によって変更されている場合は、必ずしもそれほど単純ではないかもしれません。たぶん誰かがそのようなオプションを追加することは良い考えだとRailsの開発者に提案するべきです。
Teemu Leisti

3
@TeemuLeisti schema.rbから現在のテーブル定義をコピーして貼り付けてみませんか?私はいつもこのようにしています...
jasoares 2013

1
@ジョアン・ソアレス:わかりました。ただし、プロセスを自動化できれば、rakeテーブルの名前をパラメーターとして使用して移行作成コマンドを実行するだけで、必要なupdown関数を生成できると便利です。
Teemu Leisti 2013

回答:


647

必要なコードが既に含まれているマイグレーションを単純に生成できるとは限りません。空のマイグレーションを作成して、必要なコードをそこに移入できます。

移行でさまざまなタスクを実行する方法に関する情報は、次の場所にあります。

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

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

drop_table :table_name

3
これも私にとってはうまくいきました。ただし、完全な移行(ゼロからインストール)では、テーブルが最初に作成され、後で再びドロップされます。作成と削除の移行を削除しても安全ですか?
バーク

2
テーブルを削除するか、以前のデータベーススキーマに戻すほうがよいかについて、ここで何か見解はありますか?
ウィリアムは

3
テーブルを使い終わって、それを使用する予定がない場合は、ドロップするだけです。それが使用されていない場合はそれを取り除く方が良いです。
ピート

6
答え @BederAcostaBorgesによっては、より多くの自明かつ正確である
onerinas

2
すべての外部キーも削除するにはどうすればよいですか?ドロップされているテーブルを指す他のテーブルの列があります。
Martin Konicek、2018年

352

最初に、任意の名前で空のマイグレーションを生成します。適切な日付が作成されるため、この方法で行うことが重要です。

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 :productsとだけでしたraise ActiveRecord::IrreversibleMigration

次に実行するrake db:migrateと、テーブルがドロップされます。


14
削除されるテーブルを再作成するには、ダウンマイグレーションを使用する必要があります。
fflyer05 2014年

1
開発中であっても、この移行をロールバックすることはできません。ダウンマイグレーションを空白のままにした方がよいでしょうか?
mhriess 14

1
これはより良い回答+ fflyerのコメント
Zack Shapiro

2
@mjnissimとfflyer05は正しいです。変なことを避けるために、downメソッドでテーブルを再作成する必要があります。
Sebastialonso

5
テーブルを削除すると、すべてのデータが削除されます。downメソッドでテーブルを再作成した場合、データを回復できないため、実際には適切なロールバックではありません。回復可能であるという誤った感覚を与えるよりも、移行が不可逆であることを明確に示す方が適切です。
vivi 2018

314

移行を手動で記述します。たとえば、実行しrails g migration DropUsersます。

移行のコードについては、Maxwell Holderの投稿のRails移行チェックリストを引用するだけです

悪い-実行中rake db:migraterake 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

からブロックにカットアンドペーストする場合は、外部キーschema.rbも検索schema.rbすることを忘れないでください。次に、外部キー定義をdrop_tableブロックに追加します。例:t.foreign_key "other_table"
Lencho Reyes

197

ここで提供された回答は適切に機能しますが、もう少し「わかりやすい」ものが欲しいのですが、ここで見つけました:link 最初にrails consoleに入る:

$rails console

それから単にタイプしてください:

ActiveRecord::Migration.drop_table(:table_name)

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


モデルは実行するまでまだ存在しますrails destroy model User
gm2008

2
テーブルを完全に削除する場合にのみ、これを実行してください。Railsはこの低下を認識しません。このコマンドを実行すると、移行が中断されます。作成、削除できません... ETC。エラーSQLite3 :: SQLException:no such table:accruals:DROP TABLE "sometable"
zee

36

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

rails generate migration drop_table_xyz

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

drop_table :tablename

または移行せずにテーブルを削除したい場合は、単にレールコンソールを開いて

$ rails c

次のコマンドを実行します

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

または、より簡単なコマンドを使用できます

ActiveRecord::Migration.drop_table(:table_name)

21
  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

13

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

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

ドロップする必要があるテーブルに対してこれを実行しただけですが、正直に言って「ダウン」をテストしなかったので、なぜそうするのかわかりませんでした。


1
奇妙ですが、私もこれを行わなければならないようです。
digitalWestie 2011

7
または、次のように使用することもできます:raise ActiveRecord::IrreversibleMigrationself.downメソッドで、ロールバックしようとした場合に、少なくともエラー/通知を自分に与える。
Steph Rose

1
それ以外の場合はテストされていないコードをプロジェクトに導入しているので、ダウンをテストします。元の移行のupメソッドをどのように再利用できますか?私が試したCreateMyTable.upし、ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, X)ここで、Xが最初にテーブルを作成したことの移行ですが、作品でもない-の両方に移行がすでに適用され、静かにそれを持っている場合は、それをスキップされているかどうか、AR最初のチェックに近づきます。`
Isaac Betesh 2013年

12

Railsコンソールからテーブルをドロップするだけです。まずコンソールを開きます

$ rails c

次に、このコマンドをコンソールに貼り付けます

ActiveRecord::Migration.drop_table(:table_name)

table_nameを削除するテーブルに置き換えます。

ターミナルから直接テーブルをドロップすることもできます。アプリケーションのルートディレクトリに入力して、このコマンドを実行するだけです

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

10

シンプルで公式な方法は次のとおりです。

  rails g migration drop_tablename

次にdb / migrateに移動し、ファイル名としてdrop_tablenameを含むファイルを探して、これを編集します。

    def change
      drop_table :table_name
    end

次に、実行する必要があります

    rake db:migrate 

コンソールで。


9

ガイドにある方法で移行をロールバックできます。

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

このようにして、ロールバックして、移行を元に戻すこともできます。


8

例外を発生させるか、現在は空のテーブルを再作成しようとする代わりに-移行のロールバック、やり直しなどを有効にしながら-

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

8

私はそれを移行スクリプトで機能させることができなかったので、この解決策を進めました。端末を使用してRailsコンソールに入ります。

rails c

タイプ

ActiveRecord::Migration.drop_table(:tablename)

それは私にはうまくいきます。これにより、前のテーブルが削除されます。実行することを忘れないでください

rails db:migrate



2

移行スクリプトとテーブル自体を削除する必要がありました...

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"

1

あなたができる最善の方法は

rails g migration Drop_table_Users

その後、次のことを行います

rake db:migrate

1

走る

rake db:migrate:down VERSION=<version>

どこ <version>元に戻す移行ファイルのバージョン番号は。

例:-

rake db:migrate:down VERSION=3846656238

1

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

rails dbconsole端末から入力

パスワードを入力する

コンソールで行う

USE db_name;

DROP TABLE table_name;

exit

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


次のように入力して開くこともできますrails db
ARK

0

特定のテーブルを削除したい場合は、

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

そうでなければ、あなたができるすべてのデータベースを削除したいなら

$rails db:drop

-1

ドロップテーブル/移行

run:-$ railsは移行DropTablenameを生成します

exp:-$レールは移行DropProductsを生成します


-1

次のコマンドを実行します:-

rails g migration drop_table_name

次に:

rake db:migrate

または、MySqlデータベースを使用している場合:

  1. データベースでログイン
  2. show databases;
  3. show tables;
  4. drop table_name;

3
この答えは、既存の受け入れられた答えに何かを追加しますか?そうでない場合、これを投稿する必要はありません。
Tom Lord

1
これはすでに質問自体で述べられているように、レール4.2で空の移行を作成します。
bert bruynooghe

これは正確にOPが最初に試みたものです...この答えは削除する必要があります
webaholik

簡単な答えを追加しても、反対票を投じる価値はありません。それはまだ関係があると思います。新しいユーザーに親切にしてください。
ARK、

-2

スキーマからテーブルを削除する場合は、以下の操作を実行します-

rails db:rollback
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.