Я добавил таблицу, которая, как мне казалось, мне понадобится, но теперь я больше не планирую ее использовать. Как мне удалить эту таблицу?
Я уже запустил миграцию, поэтому таблица находится в моей базе данных. Я полагаю, что 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
Это приведет к генерации файла .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 destroy model User
Вам нужно создать новый файл миграции, используя следующую команду
rails generate migration drop_table_xyz
и напишите код drop_table во вновь создаваемом файле миграции (db/migration/xxxxxxx_drop_table_xyz), например
drop_table :tablename
Или, если вы хотите удалить таблицу без миграции, просто откройте консоль рельсов
$ 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 в момент создания переноса.
Кажется немного странным, чтобы ввести код для создания таблицы, которую, как вы знаете, вам больше не понадобятся, но это сохранит весь код миграции и "официальный", верно?
Я просто сделал это для таблицы, которую мне нужно было сбросить, но, честно говоря, не тестировал "вниз" и не знал, почему я бы это сделал.
raise ActiveRecord::IrreversibleMigration
в методе self.down, чтобы вы в LEAST выдавали ошибку / уведомление, если вы когда-нибудь попытаетесь откатиться.
вы можете просто отбросить таблицу из консоли 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
Таким образом, вы также можете откатить и использовать, чтобы отменить любую миграцию
Откройте консоль рельсов
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
на консоли.
ActiveRecord::Base.connection.drop_table :table_name
Альтернатива повышению исключений или попытке воссоздать пустую таблицу, в то же время разрешая откат миграции, повтор и т.д.
def change
drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end
Это не лучшее решение до сих пор, если вы не находитесь на ранней стадии разработки.
Разработка ENV. Вы можете удалить перенесенный файл из (db/migrate/name_of_migrated_file)
.
rake db:drop
rake db:create #This is unnecessary if using SQlite, but useful sometimes.
rake db:migrate
#or
rake db:migrate:reset
Запустите эту команду: -
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
Run
rake db:migrate:down VERSION=<version>
Где <version>
- номер версии вашего файла миграции, который вы хотите вернуть.
Пример: -
rake db:migrate:down VERSION=3846656238
Я не смог заставить его работать со сценарием миграции, поэтому я выбрал это решение. Войдите в консоль рельсов, используя терминал:
rails c
Тип
ActiveRecord::Migration.drop_table(:tablename)
Это хорошо работает для меня. Это удалит предыдущую таблицу. Не забудь бежать
rails db:migrate
если вы хотите удалить конкретную таблицу, вы можете сделать
$ rails db:migrate:up VERSION=[Here you can insert timestamp of table]
в противном случае, если вы хотите удалить всю свою базу данных, вы можете сделать
$rails db:drop
Drop Table/Migration
запустить: - $ rails генерировать миграцию DropTablename
exp: - $ rails генерирует миграцию DropProducts
rails generate migration
имеют параметры командной строки для генерации кода миграции для создания таблиц, добавления или изменения столбцов и т. Д., Было бы неплохо, если бы у него также была опция для удаления таблицы, но это не так. Конечно, писатьup
часть просто - просто позвонитеdrop_table
- ноdown
часть, создавая таблицу снова, может быть не всегда так просто, особенно если схема таблицы в вопросе была изменена миграцией после его первоначального создания , Возможно, кто-то должен предложить разработчикам Rails, что добавление такой опции было бы хорошей идеей.