スキーマ管理ツール Ridgepole にexecute
メソッドを追加してみました。
https://github.com/winebarrel/ridgepole/tree/v0.4.8#execute
rc1なのでインストールする場合は--pre
オプションが必要になります。
使い方
execute
を使ってforeign keyを貼る例です:
create_table "authors", force: true do |t| t.string "name", null: false end create_table "books", force: true do |t| t.string "title", null: false t.integer "author_id", unsigned: true, null: false end add_index "books", ["author_id"], name: "idx_author_id", using: :btree execute("ALTER TABLE books ADD CONSTRAINT fk_author FOREIGN KEY (author_id) REFERENCES authors (id)") do |c| # Execute SQL only if there is no foreign key c.raw_connection.query("SELECT 1 FROM information_schema.key_column_usage WHERE TABLE_SCHEMA = 'bookshelf' AND CONSTRAINT_NAME = 'fk_author' LIMIT 1").each.length.zero? end
execute(...)
にブロックを渡した場合、ブロックがtrueの場合のみSQLを実行します。
上記の例では少しわかりにくいですが、fk_author
がない場合だけforeign keyを貼っています。
業務上で制約を貼ることがないので、どのくらい役に立つのかきちんとわかっていません。
使う機会があるかたがいたら、ご意見なりIssueなりいただけると助かります m(_ _)m