Rails DB Migration-Как удалить таблицу?
я добавил таблицу, которая, как я думал, мне понадобится, но теперь больше не планирую ее использовать. Как мне удалить этот стол?
Я уже запустил миграции, поэтому таблица находится в моей базе данных. Я думаю rails generate migration
должен быть в состоянии справиться с этим, но я еще не понял, как это сделать.
Я пробовал:rails generate migration drop_tablename
,
но это только породило пустую миграцию.
Что такое "официальный" способ бросить стол в Rails?
19 ответов
вы не всегда сможете просто создать миграцию, чтобы уже иметь нужный код. Можно создать пустую миграцию, а затем заполнить ее нужным кодом.
вы можете найти информацию о том, как выполнить различные задачи в области миграции здесь:
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 generate migration drop_table_xyz
и напишите код drop_table во вновь созданном файле миграции (db/migration / xxxxxxx_drop_table_xyz), как
drop_table :tablename
или если вы хотите удалить таблицу без миграции, просто откройте консоль rails с помощью
$ rails c
и выполните следующую команду
ActiveRecord::Base.connection.execute("drop table table_name")
или вы можете использовать более упрощенную команду
ActiveRecord::Migration.drop_table(:table_name)
- rails G миграция drop_users
- изменить миграционную
class DropUsers < ActiveRecord::Migration
def change
drop_table :users do |t|
t.string :name
t.timestamps
end
end
end
- rake db: migrate
Я думаю, чтобы быть полностью "официальным", вам нужно будет создать новую миграцию и поместить drop_table в self.вверх. Я.затем метод down должен содержать весь код для полного воссоздания таблицы. Предположительно, этот код можно просто взять из schema.rb во время создания миграции.
Это кажется немного странным, ввести код для создания таблицы, которую вы знаете, что вам больше не понадобится, но это сохранит весь миграционный код полным и " официальным", правильно?
Я просто сделал это для таблицы, которую мне нужно было уронить, но, честно говоря, не проверял "вниз" и не уверен, почему я бы.
вы можете просто сбросить таблицу с консоли rails. сначала откройте консоль
$ rails c
затем вставьте эту команду в консоль
ActiveRecord::Migration.drop_table(: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 g migration drop_tablename
Теперь перейдите к db / migrate и найдите файл, который содержит drop_tablename в качестве имени файла и отредактируйте его.
def change
drop_table :table_name
end
до
rake db:migrate
на консоли.
альтернатива вызову исключения или попытке воссоздать теперь пустую таблицу - все еще позволяя откат миграции, повтор и т. д. -
def change
drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end
мне нужно было удалить наши сценарии миграции вместе с самими таблицами ...
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_name
затем:
rake db:migrate
или если вы используете базу данных MySql, то:
- логин с базой данных
show databases;
show tables;
drop table_name;
лучший способ сделать это
rails g migration Drop_table_Users
затем сделайте следующее
rake db:migrate
выполнить
rake db:migrate:down VERSION=<version>
здесь <version>
- это номер версии файла миграции, который вы хотите вернуть.
пример:
rake db:migrate:down VERSION=3846656238
Если вы хотите удалить определенную таблицу, вы можете сделать
$ rails db:migrate:up VERSION=[Here you can insert timestamp of table]
в противном случае, если вы хотите удалить всю свою базу данных, вы можете сделать
$rails db:drop
Drop Table / Migration
выполнить:- $ rails генерирует миграцию DropTablename
exp: - $ rails генерирует миграционные DropProducts