私が必要とするテーブルを追加しましたが、今はもう使用する予定はありません。そのテーブルを削除するにはどうすればいいですか。
私はすでに移行を実行しているので、テーブルは私のデータベースにあります。私はRails generate migration
がこれを処理できるはずだと思います、しかし私はまだどのように考え出していません。
私はもう試した:
Rails generate migration drop_tablename
しかし、それは空の移行を生み出しただけです。
Railsにテーブルをドロップするための「公式の」方法は何ですか?
あなたがいつもあなたが望むコードを既に持っているために単にマイグレーションを生成することができるというわけではありません。空の移行を作成してから、必要なコードを追加することができます。
マイグレーションでさまざまなタスクを実行する方法についての情報は、こちらにあります。
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
具体的には、次の方法でテーブルを削除する方法を確認できます。
drop_table :table_name
まず、好きな名前で空の移行を生成します。適切な日付が作成されるため、このようにすることが重要です。
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
を実行すると、それはあなたのためにテーブルを削除します。
手動で移行を書きます。例えば。 Rails g migration DropUsers
を実行してください。
移行のコードに関しては、Maxwell Holderの記事 Rails Migration Checklist を引用するつもりです。
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
ここで提供されている答えは正しく機能していますが、もう少し「わかりやすい」ものを望んでいました。 link まずRailsコンソールに入ります。
$Rails console
それからちょうどタイプしなさい:
ActiveRecord::Migration.drop_table(:table_name)
そしてやった、私のために働いた!
次のコマンドを使用して新しい移行ファイルを作成する必要があります。
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)
class DropUsers < ActiveRecord::Migration
def change
drop_table :users do |t|
t.string :name
t.timestamps
end
end
end
私は、完全に「公式」になるためには、新しい移行を作成し、そしてdrop_tableをself.upに入れる必要があると思います。 self.downメソッドには、テーブル全体を再作成するためのすべてのコードが含まれているはずです。おそらく、そのコードは、マイグレーションを作成した時点でschema.rbから取得されたものに過ぎません。
もう必要ないと思うテーブルを作成するためにコードを入れるのは少し奇妙に思えますが、それはすべての移行コードを完成させ、「公式」に保つでしょうね。
ドロップする必要があるテーブルに対してこれを実行しただけですが、 "down"をテストしていないため、なぜ実行するのかわかりません。
railsコンソールからテーブルを削除するだけです。まずコンソールを開く
$ Rails c
次にこのコマンドをコンソールに貼り付けます
ActiveRecord::Migration.drop_table(:table_name)
table_name を削除するテーブルに置き換えます。
端末から直接テーブルを削除することもできます。アプリケーションのルートディレクトリに入ってこのコマンドを実行するだけです。
$ Rails runner "Util::Table.clobber '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コンソールを開きます
ActiveRecord::Base.connection.execute("drop table table_name")
簡単で公式な方法はこれでしょう:
Rails g migration drop_tablename
今あなたのdb/migrateに行き、ファイル名としてdrop_tablenameを含んでいるあなたのファイルを探して、これに編集してください。
def change
drop_table :table_name
end
それならあなたは走る必要があります
rake db:migrate
あなたのコンソールで。
移行ロールバック、REDOなどを有効にしたまま、例外を発生させたり、現在空の表を再作成しようとしたりする代わりに -
def change
drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end
ActiveRecord::Base.connection.drop_table :table_name
私はそれを移行スクリプトで動作させることができなかったので、私はこの解決策を先に進めました。ターミナルを使ってRailsコンソールに入ります。
Rails c
タイプ
ActiveRecord::Migration.drop_table(:tablename)
私にとってはうまくいきます。これは前のテーブルを削除します。走ることを忘れないで
Rails db:migrate
このコマンドを実行します。 - /
Rails g migration drop_table_name
その後:
rake db:migrate
またはMySqlデータベースを使用している場合は、 /
show databases;
show tables;
drop table_name;
テーブルと一緒に移行スクリプトを削除する必要がありました。
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_Users
その後、次の操作を行います
rake db:migrate
実行する
rake db:migrate:down VERSION=<version>
<version>
は、元に戻す移行ファイルのバージョン番号です。
例: -
rake db:migrate:down VERSION=3846656238
あなたがスキーマからテーブルを削除したい場合は、以下の操作を行います -
Rails db:rollback
誰かがSQLでそれを行う方法を探している場合。
端末からRails dbconsole
と入力します
パスワードを入力する
コンソールで
USE db_name;
DROP TABLE table_name;
exit
スキーマから移行ファイルとテーブル構造を削除することを忘れないでください
特定のテーブルを削除したい場合は、できます。
$ Rails db:migrate:up VERSION=[Here you can insert timestamp of table]
それ以外の場合はあなたがあなたのできるすべてのあなたのデータベースを削除したい場合
$Rails db:drop