PostgreSQL diff объяснил

фото Маркус Спишке

на Unsplash

Обычный процесс разработки требует непрерывного исправления производственной базы данных с локальными изменениями, обычно автоматически вносимыми программным обеспечением orm, этот метод не точен, но обманчиво прост, все, что мы будем использовать, — это стандартные команды Unix, и для нас это достаточно хорошо.

Вы не увидите имя базы данных или имя пользователя, потому что мы будем использовать соглашение для использования учетной записи операционной системы, владеющей базой данных в локальной и рабочей среде, и обе базы данных, локальные и удаленные, будут именоваться как пользователь, все это с автоматическим входом в систему через ssh в удаленном режиме. ,

Команда diff и pg_dump

Первый подход заключается в сравнении схем. Предположим, у вас есть локальная версия dev на localhost и рабочая версия на другом сервере, называемом remote-server.

1. Получить резервную копию структуры БД на рабочем сервере

ssh remote-server pg_dump -s -Ox  > remote1.sql

Примечание. Мы получаем только схему (-ы) без каких-либо разрешений и предоставляем команды sql (-Ox).

2. Получить резервную копию локальной базы данных

pg_dump -s -Ox  > local.sql

3. Сравните две схемы

Команда Nexts сравнивает два файла и фильтрует строки, необходимые в удаленном режиме, чтобы быть похожими на локальные, используя стандартные фильтры unix grep и sed.

diff remote2.sql local.sql  | grep '^>' | sed 's/^> //'  

Разница в версиях базы данных

Если версии Postgres отличаются, скорее всего, будет много различий не по природе, а по синтаксису, то есть по использованию префиксов схемы.

Для пуленепробиваемости мы должны сделать это сравнение, используя ту же версию postgres, для этого вы должны создать локальную базу данных с удаленной схемой, а затем выполнить сравнение:

createdb temp1
psql -f remote1.sql temp1
pg_dump -s -Ox temp1  > remote2.sql

Теперь сравните снова схемы той же версии сервера

diff remote2.sql local.sql 

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

diff remote2.sql local.sql  | grep '^>' | sed 's/^> //'

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

Наконец, этот скрипт делает все

#!/bin/bash
# Compare a remote database with its local counterpart
if ( $# -ne 1 )
then
        echo Please give remote server arg
        echo Usage: postgres-diff remote-server-addr
        exit -1
fi
SERVER=$1
TEMPDB="tempdb-$RANDOM"
REMOTE1="/tmp/r1-$RANDOM"
REMOTE2="/tmp/r2-$RANDOM"
LOCAL="/tmp/loc-$RANDOM"
echo Geeting schema from remote server
ssh $SERVER pg_dump -s -Ox  > $REMOTE1.sql
echo Geeting schema from local server
pg_dump -s -Ox  > $LOCAL.sql
echo Restoring remote in local
createdb $TEMPDB
psql -f $REMOTE1.sql $TEMPDB > /dev/null

echo Getting diffs, this SQL could be invalid
pg_dump -s -Ox $TEMPDB  > $REMOTE2.sql
diff $REMOTE2.sql $LOCAL.sql  | grep '^>' | sed 's/^> //'
dropdb $TEMPDB



Источник: PostgreSQL diff объяснил


Похожие материалы по теме: PostgreSQL diff объяснил

Leave a comment