Как отбросить множество таблиц со всеми ссылками за одну миграцию? - PullRequest
0 голосов
/ 03 июля 2019

Мне нужно удалить 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, все ссылки в цикле

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...