Call `on_drop` only when tables/columns are dropped

This commit is contained in:
Gerhard Schlager 2018-03-26 17:05:18 +02:00 committed by Sam
parent 4ad401bac5
commit b945a2dc39
3 changed files with 42 additions and 3 deletions

View File

@ -44,9 +44,10 @@ module Migration
LIMIT 1 LIMIT 1
SQL SQL
builder.where(new_table_exists) if @new_name.present? builder.where(table_exists(":new_name")) if @new_name.present?
builder.where("table_schema = 'public'") builder.where("table_schema = 'public'")
.where(table_exists(":old_name"))
.where(previous_migration_done) .where(previous_migration_done)
.exec(old_name: @old_name, .exec(old_name: @old_name,
new_name: @new_name, new_name: @new_name,
@ -54,13 +55,13 @@ module Migration
after_migration: @after_migration).to_a.length > 0 after_migration: @after_migration).to_a.length > 0
end end
def new_table_exists def table_exists(table_name_placeholder)
<<~SQL <<~SQL
EXISTS( EXISTS(
SELECT 1 SELECT 1
FROM INFORMATION_SCHEMA.TABLES FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'public' AND WHERE table_schema = 'public' AND
table_name = :new_name table_name = #{table_name_placeholder}
) )
SQL SQL
end end

View File

@ -65,6 +65,19 @@ RSpec.describe Migration::ColumnDropper do
expect(has_column?('topics', 'junk')).to eq(false) expect(has_column?('topics', 'junk')).to eq(false)
expect(dropped_proc_called).to eq(true) expect(dropped_proc_called).to eq(true)
dropped_proc_called = false
Migration::ColumnDropper.drop(
table: 'topics',
after_migration: migration_name,
columns: ['junk'],
delay: 10.minutes,
on_drop: ->() { dropped_proc_called = true }
)
# it should call "on_drop" only when there are columns to drop
expect(dropped_proc_called).to eq(false)
end end
it "drops the columns immediately if the first migration was less than 10 minutes ago" do it "drops the columns immediately if the first migration was less than 10 minutes ago" do

View File

@ -86,6 +86,19 @@ describe Migration::TableDropper do
expect(table_exists?('table_with_old_name')).to eq(false) expect(table_exists?('table_with_old_name')).to eq(false)
expect(dropped_proc_called).to eq(true) expect(dropped_proc_called).to eq(true)
dropped_proc_called = false
described_class.delayed_rename(
old_name: 'table_with_old_name',
new_name: 'table_with_new_name',
after_migration: migration_name,
delay: 10.minutes,
on_drop: ->() { dropped_proc_called = true }
)
# it should call "on_drop" only when there is a table to drop
expect(dropped_proc_called).to eq(false)
end end
end end
@ -112,6 +125,18 @@ describe Migration::TableDropper do
expect(table_exists?('table_with_old_name')).to eq(false) expect(table_exists?('table_with_old_name')).to eq(false)
expect(dropped_proc_called).to eq(true) expect(dropped_proc_called).to eq(true)
dropped_proc_called = false
described_class.delayed_drop(
table_name: 'table_with_old_name',
after_migration: migration_name,
delay: 10.minutes,
on_drop: ->() { dropped_proc_called = true }
)
# it should call "on_drop" only when there is a table to drop
expect(dropped_proc_called).to eq(false)
end end
end end
end end