Инструмент командной строки для сравнения двух баз данных Apache CouchDB или Cloudant

Утилита командной строки Unix diff существует с 1970-х. Он построчно сравнивает два текстовых файла и сообщает вам различия между ними.

Привет, diff!

Если я diff два файла a.txt и b.txt, содержащие версии одного и того же стихотворения, я могу найти различия между ними с помощью команды:

$ diff a.txt b.txt
2c2
< T.S. Eliot 1888-1965
---
> T.S. Eliot
6a7
> Sprouting despondently at area gates.	
13,14d13
< 
< From Prufrock, and other observations (The Egoist, Ltd, 1917)

Строки, начинающиеся с <, означают, что «эту строку необходимо удалить», а строки, начинающиеся с >, означают, что «эту строку необходимо добавить». В других строках указывается, где в файле необходимо внести изменения. Эти машиночитаемые данные позволяют «исправлять» один файл для соответствия другому.

Мы также можем вывести те же данные в так называемом «унифицированном» формате, передав параметр -u:

$ diff -u a.txt b.txt
--- a.txt	2017-04-25 14:03:12.000000000 +0100
+++ b.txt	2017-04-25 13:56:20.000000000 +0100
@@ -1,14 +1,13 @@
 Morning at the Window
-T.S. Eliot 1888-1965
+T.S. Eliot
 
 They are rattling breakfast plates in basement kitchens,
 And along the trampled edges of the street
 I am aware of the damp souls of housemaids
+Sprouting despondently at area gates.	
  
 The brown waves of fog toss up to me	        
 Twisted faces from the bottom of the street,
 And tear from a passer-by with muddy skirts
 An aimless smile that hovers in the air
 And vanishes along the level of the roofs.
-
-From Prufrock, and other observations (The Egoist, Ltd, 1917)

В этом формате вместо < и > используются - и +, а вокруг каждого изменения содержится несколько строк контекста, что немного упрощает его усвоение.

Различие базы данных

Допустим, у нас есть две базы данных вместо двух текстовых файлов - в данном случае две базы данных Apache CouchDB ™ или Cloudant. Как мы можем определить, идентичны ли документы в каждой базе данных, а если нет, то какие?

Для этого я написал инструмент командной строки: couchdiff. Устанавливается с помощью команды npm:

npm install -g couchdiff

Затем вы можете использовать couchdiff, как diff, за исключением того, что он ожидает два URL-адреса вместо двух путей к файлам. Например:

$ couchdiff http://localhost:5984/mydb1 http://localhost:5984/mydb2
spooling changes...
sorting...
calculating difference...
2c2
< 1000543/1-3256046064953e2f0fdb376211fe78ab
---
> 1000543/2-7d93e4800a6479d8045d192577cff4f7

В этом случае две базы данных идентичны, за исключением документа с идентификатором 1000543, который находится в более поздней версии во второй базе данных.

URL-адреса могут указывать на локальные базы данных CouchDB или удаленные базы данных Cloudant, либо на то и другое:

Как и diff, couchdiff также принимает параметр -u для вывода данных в едином формате.

Как работает couchdiff?

Вот основной порядок работы утилиты couchdiff:

  1. Он получает канал изменений для каждой из баз данных и записывает идентификатор документа и токен ревизии во временный файл - по одному файлу для каждой базы данных.
  2. Временные файлы сортируются с помощью инструмента командной строки sort. Это гарантирует, что оба файла находятся в «порядке идентификаторов».
  3. Два файла сравниваются с помощью утилиты diff, которую вы видите. Если базы данных идентичны, вывода не будет.

Чтобы это работало, на вашем компьютере должны быть установлены и sort, и diff. На Mac и в большинстве дистрибутивов Linux они были бы предустановлены.

А как насчет конфликтов?

Конфликтующие документы по умолчанию couchdiff игнорируются, но добавление параметра --conflicts приводит их в действие. Вот как это выглядит:

Обе базы данных будут сравниваться, включая любые расхождения в конфликтующих версиях.

А как насчет вложений?

Инструмент couchdiff не проверяет тела двоичных вложений явно, но поскольку тела документов содержат дайджест каждого вложения, он сможет обнаруживать различия во вложениях.

Другие инструменты командной строки

Если вам нужно получить доступ к базе данных CouchDB или Cloudant из командной строки, вы можете использовать другие инструменты:

  • Couchimport - импортировать данные в хранилище документов JSON из файлов CSV / TSV и наоборот
  • Couchshell - взаимодействовать с вашими базами данных, как если бы они были файловой системой
  • Couchbackup - сделайте резервную копию базы данных в текстовый файл и так же легко восстановите

Надеюсь, эти инструменты вам пригодятся. Если у вас есть отзывы, особенно о couchdiff, дайте мне знать в комментариях ниже или создайте проблему на GitHub. Запросы на вытягивание, как всегда, приветствуются.

Как всегда, если вам понравилась эта статья, пожалуйста, порекомендуйте ее другим читателям Medium. Спасибо за чтение!