FIX: Avoid using a temporary table in image url database migration

When using pgbouncer without a transaction, it's possible for the connection to change between statements in a migration. Instead, create a real table, and drop it when the migration is finished
This commit is contained in:
David Taylor 2020-05-05 16:28:52 +01:00
parent 1019789d1a
commit 0be68f147a
No known key found for this signature in database
GPG Key ID: 46904C18B1D3F434
1 changed files with 14 additions and 1 deletions

View File

@ -9,8 +9,11 @@ class MigrateImageUrlToImageUploadId < ActiveRecord::Migration[6.0]
# Defining regex here to avoid needing to double-escape the \ characters
regex = '\/(original|optimized)\/\dX[\/\.\w]*\/([a-zA-Z0-9]+)[\.\w]*'
# Can't use a real temporary table because we're running outside a transaction
# and the connection could change between statements
drop_temporary_table! # First check it doesn't already exist
execute <<~SQL
CREATE TEMPORARY TABLE tmp_post_image_uploads(
CREATE TABLE tmp_post_image_uploads(
post_id int primary key,
upload_id int
)
@ -91,5 +94,15 @@ class MigrateImageUrlToImageUploadId < ActiveRecord::Migration[6.0]
SQL
last_update_id = result.last&.id
end while last_update_id
ensure
drop_temporary_table!
end
def drop_temporary_table!
Migration::SafeMigrate.disable!
execute <<~SQL
DROP TABLE IF EXISTS tmp_post_image_uploads
SQL
Migration::SafeMigrate.enable!
end
end