

本番にだけ存在するPKを別環境にも作成するマイグレーションを作りたいのですが  
<https://api.rubyonrails.org/classes/ActiveRecord/Migration.html>  
これを見る感じPK関連のメソッドはマイグレーションクラスに用意されていなくて  
生SQLを叩くしかないでしょうか

作るだけなら以下のSQLでできそうなのですが  
「本番ですでに存在する」というのがネックで  
あったら何もしないなかったら作成ということをするにはどういうコードを書けばいいでしょうか

[code]

    class AddPkToApiAccessCounts < ActiveRecord::Migration
      def change
        execute 'ALTER TABLE api_access_counts ADD PRIMARY KEY (`date_string`,`group_id`,`date_time_minutes`)'
      end
    end
    
[/code]

今回はおきかえるわけではないのでPKの有無さえ判定できればいいのですが  
よろしくおねがいします


CC BY-SA 4.0
2019-11-01T03:09:18.050
60169
2019-11-01T10:46:00.727
question
ruby-on-rails mysql
Rails migration で主キーの有無を判定したい


あまりきれいな方法じゃないんですが無理やりDDLの中の文字列を探して判定して一応実現できました  
もっといい方法や問題があったら指摘してもらえると助かります

[code]

    class AddPkToApiAccessCounts < ActiveRecord::Migration
      def change
        # DDL を取得して PK が存在しない場合のみ作成
        pk_statement = 'PRIMARY KEY (`date_string`,`group_id`,`date_time_minutes`)'
        result = select_one('SHOW CREATE TABLE api_access_counts')
        ddl = result['Create Table']
        if !ddl.include?(pk_statement)
          execute "ALTER TABLE api_access_counts ADD #{pk_statement}"
        end
      end
    end
    
[/code]


CC BY-SA 4.0
2019-11-01T10:46:00.727
60184
2019-11-01T10:46:00.727
60169
answer