From c7e64600e1ec9795b23ef4b61dda91da76dac52f Mon Sep 17 00:00:00 2001 From: Zeke Gabrielse Date: Fri, 16 Aug 2024 09:53:16 -0500 Subject: [PATCH] update example with logs --- README.md | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 13ce58c..f26d0b0 100644 --- a/README.md +++ b/README.md @@ -42,13 +42,55 @@ $ gem install verbose_migrations ## Usage ```ruby -class SeedTagsFromPosts < ActiveRecord::Migration[7.1] +class SeedTagsFromPosts < ActiveRecord::Migration[7.2] verbose! def up - # ... + batch_count = 0 + loop do + batch_count += 1 + update_count = exec_update(<<~SQL.squish, batch_count:, batch_size: 10_000) + WITH batch AS ( + SELECT id, unnest(tags) AS tag_name + FROM posts + WHERE tags IS NOT NULL + LIMIT :batch_size + ), inserted_tags AS ( + INSERT INTO tags (name) + SELECT DISTINCT tag_name + FROM batch + ON CONFLICT (name) DO NOTHING + RETURNING id, name + ) + INSERT INTO post_tags (post_id, tag_id) + SELECT batch.id, tags.id + FROM batch + JOIN tags ON tags.name = batch.tag_name + /* batch=:batch_count */ + SQL + break if update_count == 0 + end end end + +``` + +Before, you have a black box: + +``` +== 20240817010101 SeedTagsFromPosts: migrating ================================ +== 20240817010101 SeedTagsFromPosts: migrated (0.0312s) ======================= +``` + +After, you see progress: + +``` +== 20240817010101 SeedTagsFromPosts: migrating ================================ +==> DEBUG -- : (0.2ms) WITH batch AS ( SELECT id, unnest(tags) AS tag_name FROM posts WHERE tags IS NOT NULL LIMIT 10000 ), inserted_tags AS ( INSERT INTO tags (name) SELECT DISTINCT tag_name FROM batch ON CONFLICT (name) DO NOTHING RETURNING id, name ) INSERT INTO post_tags (post_id, tag_id) SELECT batch.id, tags.id FROM batch JOIN tags ON tags.name = batch.tag_name /* batch=1 */ +==> DEBUG -- : (0.2ms) WITH batch AS ( SELECT id, unnest(tags) AS tag_name FROM posts WHERE tags IS NOT NULL LIMIT 10000 ), inserted_tags AS ( INSERT INTO tags (name) SELECT DISTINCT tag_name FROM batch ON CONFLICT (name) DO NOTHING RETURNING id, name ) INSERT INTO post_tags (post_id, tag_id) SELECT batch.id, tags.id FROM batch JOIN tags ON tags.name = batch.tag_name /* batch=2 */ +==> DEBUG -- : (0.2ms) WITH batch AS ( SELECT id, unnest(tags) AS tag_name FROM posts WHERE tags IS NOT NULL LIMIT 10000 ), inserted_tags AS ( INSERT INTO tags (name) SELECT DISTINCT tag_name FROM batch ON CONFLICT (name) DO NOTHING RETURNING id, name ) INSERT INTO post_tags (post_id, tag_id) SELECT batch.id, tags.id FROM batch JOIN tags ON tags.name = batch.tag_name /* batch=3 */ +==> DEBUG -- : (0.1ms) ... +== 20240817010101 SeedTagsFromPosts: migrated (0.0312s) ======================= ``` ## Supported Rubies