🗂️

Railsから既存データベースのCREATE INDEXを生成

2022/02/23に公開

はじめに

所要でRailsで使用している既存データベースと同じインデックスを作成するSQLが必要になったため、自動で生成できるか確認してみました。

環境

  • Rails 6.0.3.7
  • MariaDB 10.4.22

CREATE INDEX, DROP INDEXのSQLを生成

CREATE INDEX

sql = ""
tables = ApplicationRecord.connection.tables
tables.each do |table|
  indexes = ApplicationRecord.connection.indexes(table)
  indexes.each do |index|
    columns = index.columns.map { |column| "`#{column}`" }
    sql += "CREATE #{index.unique ? 'UNIQUE ' : ''}INDEX #{index.name} ON #{index.table}(#{columns.join(', ')});\n"
  end
end

puts sql

DROP INDEX

sql = ""
tables = ApplicationRecord.connection.tables
tables.each do |table|
  indexes = ApplicationRecord.connection.indexes(table)
  indexes.each do |index|
    sql += "DROP INDEX #{index.name} ON #{index.table};\n"
  end
end

puts sql

内容

  • ApplicationRecord.connection.indexesで指定テーブルのインデクス情報が取得可能
  • ApplicationRecord.connection.tablesでテーブル一覧を取得し、インデクス情報を取得
  • インデックス情報からCREATE INDEX/DROP INDEXのSQLを生成

まとめ

Rails ApplicationRecord経由でインデックス情報が取得できたので、そこからSQLを生成することができました。
まだ運用していないので考慮漏れなどあると思いますが、これを使用できないか検討してみます。

今回はRails ApplicationRecord経由でしたが、MySQL/MariaDBならINFORMATION_SCHEMA STATISTICSテーブルやSHOW INDEXを使用する方法もありだと思いました。

Discussion