Эффективная миграция базы данных с помощью динамических запросов
13 апреля 2023 г.В недавнем проекте мы столкнулись с ситуацией, когда нам нужно было сравнить две базы данных, чтобы убедиться, что вся информация была успешно перенесена во время миграции< /а>. Чтобы решить эту проблему, я предложил использовать метод динамических запросов для программного сравнения баз данных.
:::информация Следующий выделенный курсивом абзац был сгенерирован ChatGPT.
:::
Динамические запросы — это процесс создания запросов к базе данных "на лету" или во время выполнения, а не их жесткое программирование в приложении. Другими словами, вместо предопределенных операторов SQL, которые выполняются для базы данных, динамические запросы позволяют динамически создавать операторы SQL на основе определенных критериев или условий. Этого можно добиться с помощью входных параметров, каталогов баз данных, условий и других динамических элементов.
В нашем случае нам нужно было извлечь определенное количество строк из всех таблиц в базе данных, чтобы мы могли сравнить их между двумя базами данных и проверить, все ли было правильно перенесено.
Эта задача может быть сложной, если выполнять ее вручную, особенно при работе с большим количеством таблиц (например, 300, 100 и т. д.). Однако с помощью динамических запросов нам удалось автоматизировать процесс и сэкономить время. Вот пример того, как мы использовали динамические запросы к каталогу PostgreSQL для создания новый запрос:
SELECT 'SELECT COUNT(*) AS row_numbers, ''' || table_name || ''' AS table FROM ' || table_name || ' UNION ALL '
FROM information_schema.tables
WHERE table_schema='pg_catalog'
UNION ALL
SELECT 'SELECT 0, ''dummy'''
Сгенерированный запрос выглядит следующим образом:
SELECT COUNT(*) AS row_numbers, 'pg_stat_xact_user_functions' AS table FROM pg_stat_xact_user_functions UNION ALL
SELECT COUNT(*) AS row_numbers, 'pg_stat_archiver' AS table FROM pg_stat_archiver UNION ALL
SELECT COUNT(*) AS row_numbers, 'pg_stat_bgwriter' AS table FROM pg_stat_bgwriter UNION ALL
SELECT COUNT(*) AS row_numbers, 'pg_stat_progress_analyze' AS table FROM pg_stat_progress_analyze UNION ALL
SELECT 0, 'dummy'
И результатом сгенерированного запроса будет:
row_numbers table
0 pg_stat_xact_user_functions
1 pg_stat_archiver
1 pg_stat_bgwriter
0 pg_stat_progress_analyze
0 dummy
Я надеюсь, что вы найдете эту информацию полезной для ваших будущих проектов или в качестве нового инструмента в вашем наборе инструментов! Это может быть мощной техникой для создания запросов к базе данных на лету или просто для экономии времени, когда вам нужно выполнить некоторые задачи по обслуживанию или исправить некоторые проблемы.
Дайте мне знать, если у вас есть какие-либо вопросы, если вы сталкивались с подобной ситуацией в прошлом или если это было полезно для вас! Удачного кодирования!🤗
❗️❗️При написании этой статьи не пострадал ни один программист или техлид.❗️❗️
Оригинал