🗂️
Railsから既存データベースのCREATE INDEXを生成
はじめに
所要で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