552

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

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

私はもう試した:

rails generate migration drop_tablename

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

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

4

24 に答える 24

692

必要なコードをすでに持っている移行を単純に生成できるとは限りません。空の移行を作成してから、必要なコードを入力できます。

移行でさまざまなタスクを実行する方法については、次の情報を参照してください。

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

具体的には、次のアプローチを使用してテーブルを削除する方法を確認できます。

drop_table :table_name
于 2010-10-26T01:54:46.897 に答える
378

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

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と、テーブルがドロップされます。

于 2011-10-15T18:57:14.957 に答える
363

移行を手動で記述します。例:実行しrails g migration DropUsersます。

移行のコードについては、MaxwellHolderの投稿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
于 2015-07-27T15:25:02.037 に答える
209

警告:@ z-atef@nzifnabが正しく指摘しているように、これは自己責任で行ってください。Railsはこれらの変更を認識せず、移行シーケンスの入力が失敗し、スキーマが同僚とは異なります。これは、開発のみをローカルでいじくり回すためのリソースとして意図されています。


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

$rails console

次に、次のように入力します。

ActiveRecord::Migration.drop_table(:table_name)

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

于 2012-11-08T22:38:02.363 に答える
38

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

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)
于 2015-05-26T07:42:53.620 に答える
23
  1. railsg移行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
于 2015-07-31T14:20:13.590 に答える
15

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

  rails g migration drop_tablename

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

    def change
      drop_table :table_name
    end

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

    rake db:migrate 

コンソールで。

于 2017-07-28T06:57:26.470 に答える
15

移行スクリプトで動作させることができなかったので、このソリューションを進めました。ターミナルを使用してRailsコンソールに入ります。

rails c

タイプ

ActiveRecord::Migration.drop_table(:tablename)

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

rails db:migrate
于 2018-12-11T12:26:58.437 に答える
14

完全に「公式」であるためには、新しい移行を作成し、drop_tableをself.upに配置する必要があると思います。self.downメソッドには、テーブルを完全に再作成するためのすべてのコードが含まれている必要があります。おそらく、そのコードは、移行を作成するときにschema.rbから取得することができます。

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

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

于 2011-04-03T22:50:40.927 に答える
12

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

$ rails c

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

ActiveRecord::Migration.drop_table(:table_name)

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

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

$ rails runner "Util::Table.clobber 'table_name'"
于 2015-10-16T06:59:32.473 に答える
12

例外を発生させたり、空になったテーブルを再作成しようとしたりする代わりに、移行のロールバック、やり直しなどを有効にします。

def change
  drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end
于 2017-11-20T16:15:28.750 に答える
11

ガイドに記載されている方法で移行をロールバックできます。

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

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

于 2017-05-05T17:42:34.887 に答える
7

Railsコンソールを開きます

ActiveRecord::Base.connection.execute("drop table table_name")
于 2012-12-14T06:41:05.653 に答える
5

ActiveRecord::Base.connection.drop_table :table_name

于 2014-09-08T22:16:08.463 に答える
3

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

rails dbconsole端末から入力

パスワードを入力する

コンソールで行う

USE db_name;

DROP TABLE table_name;

exit

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

于 2019-07-18T06:58:05.867 に答える
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"
于 2013-02-13T20:55:07.963 に答える
2

単純に実行することはできませんdrop_table :table_name。代わりに、次を実行して空の移行を作成できます。 rails g migration DropInstalls

次に、これをその空の移行に追加できます。

class DropInstalls < ActiveRecord::Migration
  def change
    drop_table :installs
  end
end

次にrails db:migrate、インストールテーブルを削除するコマンドラインで実行します。解決策はここで見つかりました

于 2021-11-13T08:22:42.260 に答える
1

走る

rake db:migrate:down VERSION=<version>

復元する移行ファイルのバージョン番号はどこ<version>にありますか。

例:-

rake db:migrate:down VERSION=3846656238
于 2015-08-03T12:00:33.627 に答える
1

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

rails g migration Drop_table_Users

次に、次の手順を実行します

rake db:migrate
于 2015-09-14T12:52:03.120 に答える
1

Helpful documentation

移行では、次の方法でテーブルを削除できます。

drop_table(table_name, **options)

オプション:

:force 依存オブジェクトもドロップするには、:cascadeに設定します。デフォルトはfalse

:if_exists テーブルが存在する場合にのみテーブルを削除するには、trueに設定します。デフォルトはfalse

例:

  1. ドロップテーブルの移行を作成します。たとえば、テーブルをドロップしUserたい

    rails g migration DropUsers
    
    Running via Spring preloader in process 13189
       invoke  active_record
       create    db/migrate/20211110174028_drop_users.rb
    
  2. 移行ファイルを編集します。この場合はdb/migrate/20211110174028_drop_users.rb

    class DropUsers < ActiveRecord::Migration[6.1]
      def change
        drop_table :users, if_exist: true
      end
    end
    
  3. Userテーブルを削除するための移行を実行します

    rails db:migrate
    
    == 20211110174028 DropUsers: migrating ===============================
    -- drop_table(:users, {:if_exist=>true})
       -> 0.4607s
    
于 2021-11-10T18:04:38.187 に答える
-1

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

rails g migration drop_table_name

それから:

rake db:migrate

または、MySqlデータベースを使用している場合は、次のようにします。

  1. データベースでログイン
  2. show databases;
  3. show tables;
  4. drop table_name;
于 2016-06-17T13:21:47.697 に答える
-1

ドロップテーブル/移行

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

exp:-$railsは移行DropProductsを生成します

于 2018-04-20T14:54:46.103 に答える
-1

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

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

それ以外の場合は、すべてのデータベースを削除することができます

$rails db:drop
于 2018-06-02T22:17:17.303 に答える
-4

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

rails db:rollback
于 2019-03-04T12:42:03.113 に答える