From 0be68f147a17469366708a9db51ada1c221bec46 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Tue, 5 May 2020 16:28:52 +0100 Subject: [PATCH] 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 --- ...095035_migrate_image_url_to_image_upload_id.rb | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/db/migrate/20200429095035_migrate_image_url_to_image_upload_id.rb b/db/migrate/20200429095035_migrate_image_url_to_image_upload_id.rb index 5f4747b2c3..e6d905f5df 100644 --- a/db/migrate/20200429095035_migrate_image_url_to_image_upload_id.rb +++ b/db/migrate/20200429095035_migrate_image_url_to_image_upload_id.rb @@ -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