Мне нужно удалить 150 из 400+ таблиц в базе данных. И я хочу удалить его со всеми ссылками. Каков наилучший способ сделать это?
Я пытался сделать это следующим образом
class RemoveOldTables < ActiveRecord::Migration
UNUSED_TABLES = %w[
...
].freeze
def up
foreign_keys = foreign_key_list.with_indifferent_access
unused_existed_tables = UNUSED_TABLES & ActiveRecord::Base.connection.tables
unused_existed_tables.each do |table|
foreign_keys[table].each do |item|
remove_column item[:table], item[:column_name], :integer
end
drop_table table, force: :cascade
end
end
def foreign_key_list
sql = <<-SQL
select kcu.table_schema || '.' || kcu.table_name as foreign_table,
'>-' as rel,
rel_kcu.table_schema || '.' || rel_kcu.table_name as primary_table,
kcu.ordinal_position as no,
kcu.column_name as fk_column,
'=' as join,
rel_kcu.column_name as pk_column,
kcu.constraint_name
from information_schema.table_constraints tco
join information_schema.key_column_usage kcu
on tco.constraint_schema = kcu.constraint_schema
and tco.constraint_name = kcu.constraint_name
join information_schema.referential_constraints rco
on tco.constraint_schema = rco.constraint_schema
and tco.constraint_name = rco.constraint_name
join information_schema.key_column_usage rel_kcu
on rco.unique_constraint_schema = rel_kcu.constraint_schema
and rco.unique_constraint_name = rel_kcu.constraint_name
and kcu.ordinal_position = rel_kcu.ordinal_position
where tco.constraint_type = 'FOREIGN KEY'
order by kcu.table_schema,
kcu.table_name,
kcu.ordinal_position;
SQL
result = ActiveRecord::Base.connection.execute(sql)
result.to_a.each_with_object({}) do |item, obj|
foreign_table =item['foreign_table']
primary_table = item['primary_table']
obj[primary_table] ||= []
obj[primary_table] << { table: foreign_table, column_name: item['fk_column'] }
end
end
end
Но я получил следующую ошибку при удалении одного из столбцов:
PG :: DependentObjectsStillExist: ОШИБКА: невозможно удалить столбец
acade_year_id таблицы course_lesson_plans, потому что другие объекты
зависит от него ДЕТАЛИ: представление v_course_lesson_plans зависит от столбца
acade_year_id таблицы course_lesson_plans ПОДСКАЗКА: Используйте DROP ...
CASCADE для удаления зависимых объектов тоже. : ALTER TABLE
"course_lesson_plans" DROP "acade_year_id"
Как удалить все таблицы, все foreign_keys, все ссылки в цикле