Содержание
Как сравнивать базы данных через Compare Datasets?
Черновик готовит редакция с помощью ИИ. За стандарт издания отвечает главный редактор — Валерий Курземнек.
В SQL есть нюанс, который мучает многих дата-аналитиков: как сравнить таблицы между двумя базами данных? К сожалению, простого решения не существует:
- Вы можете создать SQL-скрипт, сравнивающий две таблицы, но он не универсален и должен переписываться для каждого нового случая.
- Сравнение таблиц и схем баз данных доступно в таких инструментах, как Azure Data Studio или SQL Server Data Tools. Однако они используются не повсеместно.
- И хотя существуют менее популярные инструменты, которые генерируют отчеты о разнице между таблицами, многие из них ограничены одним типом базы данных.
Задача может стать еще сложнее, если наборы данных поступают из разных SQL-движков и несвязанных систем, таких как Google Sheets и облачная CRM.
На помощь приходит зерокодинг. В этой статье мы разбираем подход для сравнения записей, загруженных из двух источников в n8n. Перед сравнением нужно согласовать поля и ключи записей; сравнение структуры схем базы этим сценарием не выполняется. Нам поможет n8n — инструмент автоматизации рабочего процесса с исходным кодом.
Вам больше не нужно будет создавать SQL-скрипты для каждого нового случая использования. Руководство позволит обойти ограничения, которые связаны с инструментами, привязанными к одному типу баз данных.
Подготовим тестовую среду
Создадим бесплатный сервер MySQL и импортируем базу данных примера. Если у вас уже есть база данных SQL, вы можете пропустить этот шаг и перейти непосредственно к первому сценарию: сравнению наборов данных SQL.
Шаг 1. Получите доступ к бесплатному серверу MySQL
Существует несколько бесплатных песочниц SQL, таких как DB fiddle или SQLZoo, которые предлагают среду для тестирования. Хотя они имеют простой в использовании браузерный пользовательский интерфейс, нам нужна платформа с возможностью удаленного подключения для импорта данных в n8n. Поэтому мы предлагаем создать бесплатный аккаунт на сайте db4free. Просто введите желаемое имя базы данных, пользователя, пароль и адрес электронной почты.
Db4free предлагает простую в настройке базу данных SQL с удаленным доступом
После регистрации вы получите электронное письмо со ссылкой для активации. Щелкните по ней, прежде чем пытаться подключиться к новой учетной записи. Теперь вы можете войти в систему через phpMyAdmin — удобный инструмент для управления удаленными базами данных SQL.
Шаг 2. Импортируйте готовую базу данных
Теперь, когда у вас есть бесплатная учетная запись с удаленным доступом к серверу MySQL, давайте заполним базу данных. Вы можете либо создать все таблицы с нуля, либо импортировать небольшой фрагмент существующих данных для тестирования.
Мы будем использовать базу данных model с сайта MySQL Tutorial. Скачайте базу данных classicmodels, распакуйте архив и откройте файл mysqlsampledatabase.sql в текстовом редакторе:
Удалите оператор CREATE DATABASE и введите имя вашей базы данных в операторе USE
Поскольку служба db4free не позволяет создавать новые базы данных с произвольными именами, вам придется удалить оператор CREATE DATABASE и указать имя вашей базы данных в операторе USE. После внесения этих изменений сохраните файл mysqlsampledatabase.sql.
Затем импортируйте эту базу данных в phpMyAdmin, выполнив следующие шаги:
- Щелкните по своей базе данных слева;
- Перейдите на вкладку Import;
- Выберите файл
mysqlsampledatabase.sql; - Отключите опцию Enable foreign key checks («Включить проверку внешних ключей») — этот шаг очень важен для успешного импорта;
- Прокрутите страницу вниз и нажмите кнопку «Импорт».
После завершения импорта вы увидите новые таблицы под именем вашей базы данных.
phpMyAdmin поддерживает импорт из файлов нескольких форматов
Сценарий 1: Сравнение наборов данных SQL
В этом разделе мы расскажем вам, как сравнить две таблицы в SQL с помощью n8n. Вот базовая схема работы:
Простой сценарий n8n для сравнения двух наборов данных
Шаг 1. Добавьте новый узел MySQL
Сначала добавьте новый узел MySQL и укажите учетные данные для базы данных db4free:
Учетные данные MySQL для доступа к базе данных db4free
В этом примере мы сравниваем два немного отличающихся подмножества из одной таблицы, взятых из одной базы данных. В реальной жизни вам может понадобиться сравнить две версии одной и той же таблицы, хранящиеся в двух разных копиях базы данных. Или вы можете сравнить два подмножества данных из совершенно разных СУБД (в этом случае сначала необходимо переименовать переменные, чтобы они совпадали в обоих источниках). Узел Compare Datasets в n8n справится со всеми этими задачами.
Шаг 2. Загрузите данные из MySQL в n8n
Теперь импортируем некоторые данные. В этом руководстве мы смоделируем загрузку двух немного отличающихся сводных отчетов из MySQL.
Выберите операцию Execute SQL в первом узле MySQL и введите следующий запрос:
SELECT customerNumber, SUM(amount) as Total, COUNT(*) as ordercount, YEAR(paymentDate) as year
FROM payments
WHERE YEAR(paymentDate) = '2003' OR YEAR(paymentDate) = '2004'
GROUP BY customerNumber, year;
Этот SQL-запрос создает сводный отчет для таблицы платежей, рассчитывая общую сумму и количество транзакций для каждого клиента за два последовательных года. Вы можете изучить некоторые основные команды SQL на сайте MySQL Tutorial.
Шаг 3. Добавьте второй узел MySQL
Теперь нужно получить немного другой набор данных, добавив второй узел MySQL:
- Скопируйте первый узел MySQL и переименуйте его в «Заказы 2004 и 2005 годов»;
- Используйте те же настройки, что и в первом узле, но измените годы в запросе;
- Затем добавьте узел Set, чтобы переопределить количество платежей (ordercount), установив его на фиксированное значение 1. Таким образом мы немного изменим некоторые данные, поступающие из второго узла MySQL.
Переопределение переменной ordercount в узле Set
Шаг 4. Используйте узел Compare Datasets (Сравнение наборов данных)
Теперь можно сравнивать два разных набора данных. Добавьте новый узел Compare Datasets и настройте его, введя customerNumber и year в поля Input A и Input B.
Узел Compare Datasets классифицирует входящие данные на четыре различных выхода
Давайте подробнее рассмотрим правую часть скриншота. In A only Branch показывает только первый набор входных данных (например, записи за 2003 год). Аналогично, в ветке In B only Branch содержится только второй набор входных данных (например, записи за 2005 год):
B only Branch имеет записи, которые поступают только со второго входа
Результаты на других двух вкладках несколько интереснее.
Same Branch содержит элементы, которые присутствуют в обоих входах и являются абсолютно одинаковыми.
Примеры вывода данных из той же ветки
Different Branch отображает элементы с одинаковыми полями соответствия, но с различиями в других переменных.
Различные отделения предоставляют подробную информацию для сравнения
В этом выводе вы можете увидеть, какие поля использовались для сопоставления (ключи), какие из них одинаковые, а какие разные. Обратите внимание, что переменная Total осталась прежней (поскольку мы ее не меняли). Однако переменная ordercount указана как другая. Это ожидаемо, так как мы изменили ее ранее.
Выполнив описанные выше шаги, вы сможете успешно сравнить таблицы между двумя базами данных с помощью n8n. Эта функция позволяет выполнять подробный анализ и оценку данных в упрощенном режиме, экономя ваше время и обеспечивая точность процессов обработки данных.
Сценарий 2: синхронизация данных SQL и Pipedrive
Теперь, когда мы наглядно разобрали, как работает узел Compare Datasets, давайте рассмотрим более сложный сценарий. Он синхронизирует два отдельных источника путем добавления недостающих записей и обновления измененных значений для существующих записей.
Этот сценарий регулярно синхронизирует таблицы Pipedrive и MySQL
Шаг 1. Подготовьте учетные записи
В предыдущем разделе мы уже описали, как создать бесплатный сервер MySQL и подключиться к нему. Вы можете добавить новую таблицу persons с несколькими переменными (id, name, primary_email, phone и update_time).
Создайте новые учетные данные для Pipedrive. Необязательно использовать именно его. Рабочий процесс можно адаптировать для подключения к вашей CRM, если она поддерживает API.
Шаг 2. Загрузите данные из MySQL и Pipedrive в n8n
Когда у вас есть данные из обоих источников, соедините узлы Compare Datasets. Добавьте узел Set сразу после узла Pipedrive, определите несколько переменных (id, name, primary_email, phone, update_time) и активируйте переключатель Keep Only Set. Это гарантирует, что все лишние переменные будут отброшены перед сравнением наборов данных.
Шаг 3. Сравните данные SQL и Pipedrive
Выполните узел Compare Datasets и обратите внимание, что элементы находятся в четырех разных выходных данных, аналогично тому, что было в первом сценарии.
Чтобы добавить недостающие записи, подключите узлы MySQL и Pipedrive, как показано на скриншоте, и настройте их на добавление новых записей.
Обратите внимание, что элементы ветки In A only Branch содержат записи только из источника MySQL, а значит, узел Pipedrive должен быть подключен к этому выходу.
То же и с In B only Branch. Те элементы, которые находятся только в Pipedrive, должны быть добавлены в базу данных MySQL.
Сравните данные SQL и Pipedrive
Шаг 4. Обновите измененные данные
Записи из вывода Same Branch не требуют никаких дополнительных действий.
Однако записи Different Branch необходимо синхронизировать. Это достигается за три коротких шага:
- Добавьте узел IF и настройте новое булевое условие
{{ !!$json["different"]["name"] || !!$json["different"]["phone"] }}. Это позволит нам отлавливать изменения только в переменных name и phone. - Далее добавим узел Date & Time и преобразуем переменную update_time из MySQL. Эта переменная, изначально имеющая символьный формат, должна быть преобразована для сравнения дат.
- В другом узле IF добавьте условие Date & Time. Введите даты из обоих источников и проверьте, какая из них более поздняя.
Узел IF сравнивает, произошло ли первое значение Date & Time (Value 1) позже, чем значение 2 (Value 2)
Наконец, подключите узлы MySQL и Pipedrive к соответствующим выходам и настройте их на обновление существующих записей. Устанавливать узлы перед Update Person и Update Contact необязательно. В них просто указываются короткие имена переменных для значений идентификатора записи, имени и телефона. Таким образом, если имя пользователя или номер телефона изменится в одной системе, обновления будут отражены во второй.
n8n поддерживает множество SQL-движков благодаря встроенным узлам для MySQL, PostgreSQL и MS SQL. Выберите наиболее подходящий для вашего проекта и начните синхронизировать данные с сотнями других инструментов с помощью узла Compare Datasets. Если у вас есть какие-то вопросы по работе с n8n, задайте их в тематическом чате Telegram, где собрались самые разные специалисты, использующие инструмент. Здесь вы найдете поддержку коллег и ответы на свои вопросы.
Перед Compare Datasets: типы ключей, служебные поля и дубли
Строковый идентификатор и числовой идентификатор — это разные значения, даже если выглядят одинаково. Если один источник отдаёт id как число, а другой как строку, сопоставление ключей может не сработать. По документации узла Compare Datasets сравнение идёт в два этапа: сначала сопоставляются выбранные ключи, затем сравниваются остальные поля. Опция Fuzzy Compare считает число 3 и строку 3 одинаковыми; без неё эти типы различаются. Это важно, когда данные приходят из разных систем: одна база хранит числовой первичный ключ, другая — строковый внешний идентификатор.
Редакционный пример
Шаблон ниже составлен редакцией; данные условны, фактический прогон n8n не выполнялся. Ожидаемая логика приведена по документации узла.
Условный пример: два снимка одной таблицы
Снимок A (источник MySQL)
id: 3 (число)
name: "Альфа"
exported_at: "2026-01-10T08:00:00Z"
Снимок B (источник CRM)
id: "3" (строка)
name: "Альфа"
exported_at: "2026-01-11T09:30:00Z"
Ожидаемая логика по документации:
без Fuzzy Compare -> ключи 3 и "3" не совпадают
с Fuzzy Compare -> ключи совпадают, далее сравниваются name и exported_at
exported_at в Fields to Skip Comparing -> различие по времени выгрузки не влияет
Как проверить такой пример
- Сравните типы ключа в обоих входах. Если один источник отдаёт число, а другой строку, решите заранее: приводить типы узлом Edit Fields или включить Fuzzy Compare. Edit Fields может создавать и перезаписывать поля перед сравнением.
- Исключите служебные поля снимка. Поле
exported_atописывает момент выгрузки. Содержимое записи оно не описывает. По документации Fields to Skip Comparing исключает поля из сравнения содержимого — добавьте туда только служебные поля, не трогая бизнес-данные. - Проверьте дубли одного ключа. Multiple Matches по умолчанию включает все совпадения; доступен режим Include First Match Only. Если в снимке несколько строк с одним ключом, автоматический выбор первого скрывает конфликт. Перед синхронизацией прогоните вход через Remove Duplicates: узел различает повторы внутри текущего входа и обработанное в прошлых исполнениях.
- Сделайте пробный прогон без записи в базу. Сначала посмотрите, в какие ветви попадают записи, и только затем подключайте узлы обновления. Заранее выберите авторитетный источник: если
nameрасходится, обновление должно идти из той системы, которая считается основной.
Такой порядок не заменяет разбор четырёх ветвей Compare Datasets и синхронизации по update_time из основной статьи — он дополняет его подготовкой входных данных.
Сравнение двух баз данных в Database .NET
Database .NET — многофункциональный менеджер баз данных: по описанию разработчика он позволяет просматривать объекты, проектировать таблицы, редактировать строки, выполнять запросы, генерировать скрипты, а также импортировать, экспортировать, переносить и синхронизировать данные через единый интерфейс. Когда источники относятся к разным движкам, это удобно: одно приложение умеет подключаться к множеству СУБД. Практическая последовательность сравнения двух баз может быть такой. Сначала в каждой базе отдельно выполните запрос, выбирающий один и тот же набор столбцов и один и тот же ключ; если наборы нужно согласовать, задайте одинаковые псевдонимы столбцов. Затем выгрузите оба результата в сопоставимом формате, например CSV, через экспорт данных. После этого сверьте строки по выбранному ключу и одинаковым полям — в этой статье для такой сверки описан узел Compare Datasets в n8n, куда можно подать обе выгрузки. Такой порядок опирается на документированные возможности программы (запросы и экспорт данных), и он не приписывает Database .NET автоматического diff баз или отдельных меню сравнения. Разграничивайте уровни: сравнение данных сопоставляет строки таблиц по ключу и одинаковым полям, тогда как сравнение структуры схемы проверяет состав таблиц, столбцов, типов и индексов — для этого полезно выгрузить дампы структуры и сопоставить их отдельно.
phpMyAdmin: сравнение двух баз данных и схема сравнения
phpMyAdmin — бесплатный инструмент на PHP для администрирования сервера MySQL или MariaDB. По документации он умеет создавать, просматривать, редактировать и удалять базы, таблицы, представления, столбцы и индексы, выполнять и сохранять SQL-запросы, включая пакетные, загружать текстовые файлы в таблицы, создавать и читать дампы, а также отслеживать изменения в базах, таблицах и представлениях. Отсюда два разных уровня работы. Сравнение данных двух баз выполняется через SQL-запросы к обеим базам и сопоставление результатов по ключу. Схема сравнения — это сопоставление структуры: какие таблицы, столбцы, типы и индексы есть в одной базе и отсутствуют или отличаются в другой; для этого удобно выгрузить дампы структуры и сопоставить их. phpMyAdmin сам по себе не выполняет автоматический diff двух баз, он даёт средства для запросов, дампов и отслеживания изменений, на основе которых сравнение строится вручную или скриптом.
n8n: сравнение двух файлов и создание файла различий
Если данные лежат в файлах, путь в n8n строится так. Сначала узлом Extract From File извлекаем данные из бинарного файла и преобразуем их в JSON — узел поддерживает CSV, JSON, XLSX, XLS, ODS, HTML, PDF, RTF, текстовые файлы и ICS. Затем оба набора JSON подаём в Compare Datasets, чтобы получить ветви с отличающимися записями и записями только из одного источника. Дальше соберите нужные выходы сравнения — Different, In A only и In B only — в один набор записей, который вы хотите сохранить как файл различий. Преобразуйте этот JSON в бинарный файл узлом Convert to File: выберите операцию под нужный формат (например, Convert to CSV) и укажите параметр Put Output File in Field, то есть имя поля, в котором появится бинарное содержимое файла. Только после этого добавляйте Read/Write Files from Disk в режиме Write File to Disk: в поле Input Binary Field укажите то же имя, что задали в Convert to File, а путь назначения и имя файла задайте в документированном поле File Path and Name. Параметр File(s) Selector относится к чтению файлов (Read File(s) From Disk) и для записи не используется. Важное ограничение: JSON-выход Compare Datasets сам по себе не готов для записи этим узлом, ему нужен бинарный вход от Convert to File. И это сравнение табличных данных по ключу — оно не выполняет побайтовый diff произвольных файлов; для неструктурированного текста такой путь не подходит.
Частые вопросы
Почему записи с одинаковым id попадают в Different? Ветвь Different формируется, когда выбранные ключи совпали, а остальные сравниваемые поля различаются — например, служебное поле exported_at с разным временем выгрузки. Если же типы ключей не совпадают (в одном источнике id число, в другом строка), то без Fuzzy Compare ключи не сопоставляются. Тогда такие записи попадают в ветви In A only или In B only. В Different они не попадают.
Как исключить время выгрузки из сравнения? Добавьте служебное поле в Fields to Skip Comparing. Тогда узел не будет учитывать его при сравнении содержимого. Сопоставление продолжится по выбранным ключам.
Что делать, если в снимке несколько строк с одним ключом? Сначала проверьте повторы отдельным узлом Remove Duplicates, затем решите, какой режим Multiple Matches нужен. По умолчанию включаются все совпадения, а режим только первого совпадения может скрыть конфликт.













