2017-01-30 12 views
4

Когда выполняется PostgreSQL pg_dump, вставляются комментарии для каждого элемента, как показано ниже.Удаление комментариев из вывода pg_dump

-- 
-- Name: my_table; Type: TABLE; Schema: account; Owner: user; Tablespace: 
-- 

CREATE TABLE my_table(
    id integer 
); 

-- 
-- Name: my_seq; Type: SEQUENCE; Schema: account; Owner: user 
-- 

CREATE SEQUENCE my_seq 
    START WITH 1 
    INCREMENT BY 1 
    NO MINVALUE 
    NO MAXVALUE 
    CACHE 1; 

Можно ли заставить pg_dump удалить (исключить) их? Я хотел бы получить просто:

CREATE TABLE my_table(
    id integer 
); 

CREATE SEQUENCE my_seq 
    START WITH 1 
    INCREMENT BY 1 
    NO MINVALUE 
    NO MAXVALUE 
    CACHE 1; 
+2

Проведите его через 'sed' следующим образом:' sed -e '/^-/d'' –

+0

@LaurenzAlbe, Не могли бы вы разместить ответ, наилучшим образом описывающий ваше предложение? Я не понимал, как его использовать. –

+0

В какой операционной системе вы работаете? –

ответ

4

В операционной системе типа UNIX, я хотел бы сделать это следующим образом:

pg_dump [options] mydatabase | sed -e '/^--/d' >mydatabase.dmp 
+0

Он отлично работает, большое спасибо! Он заменил комментарии на пустую строку, можно ли ее удалить? Не очень важно, но файл будет более чистым. –

+0

Это удалит строку и * не * оставьте пустую строку позади. Пустые строки, которые вы видите, пусты в исходном файле дампа. Используйте команду 'sed''/^ $/d', чтобы удалить их. –

+0

Вы правы, прекрасный ответ, спасибо! –

1

Марсио, трубопроводов процесс принятия выход одного процесса и подачи его непосредственно в другую для достижения конкретной цели. Предположим, вы использовали Юлию для достижения нужного вам результата. Создайте тестовую базу данных и поиграйте с ней, чтобы получить желаемый результат. Эта команда Julia будет производить резервное копирование с комментариями:

run(pipeline(`pg_dump -d test`,"testdump.sql")) 

Здесь Юлия просит сбросить резервную копию в testdump.sql, чтобы мы могли проверить результат. Обратите внимание на обратные выходы. Затем приходит другая команда, которая использует фильтр, предложенный @LaurenzAlbe:

run(pipeline(`cat testdump.sql`,`sed -e '/^--/d'`,"testdump2.sql")) 

Здесь мы имеем три части конвейер, который сканирует резервную копию с комментариями, раздевает комментарии, и отвалы, что остается в testdump2. Теперь вы можете проверить, что требуется первый и второй файлы.

После того, как вы уверены, что решение, предоставленное @LaurenzAlbe, является правильным, вы можете сделать необходимые замены для запуска всего объекта в одной команде конвейера. Конечно, вы можете сделать то же самое прямо в терминале bash или Python или в скриптовом движке по вашему выбору.

2

Я только представил этот patch для Postgres 11+ (на стадии рассмотрения), что должно позволить один сваливать без КОММЕНТАРИИ (пока не будет идеальное решение), которое должно быть немного лучше, чем те, которые мы прибегаем к использованию.

Если голосов достаточно, он может даже вернуться в Postgres 10!

0

только 2 хорошие причины для удаления комментариев из SQL:

  1. Файл SQL содержит форматирование переменных (местозаполнители), которые должны быть заменены динамически. В этом случае удаление комментариев предотвращает обнаружение ложных переменных, если они указаны в комментариях.

  2. Файл SQL должен быть сведен к минимуму, чтобы уменьшить размер того, что должно пройти через IO и на сервер базы данных.

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

И специально для PostgreSQL, есть пакет pg-minify, который делает именно то, что:

  • Она удаляет все комментарии и минимизирует полученный SQL
  • Опционально он может сжать SQL до его минимума (опция compress)

полный пример

const minify = require('pg-minify'); 
const fs = require('fs'); 

fs.readFile('./sqlTest.sql', 'utf8', (err, data) => { 
    if (err) { 
     console.log(err); 
    } else { 
     console.log(minify(data)); 
    } 
}); 
+0

Хорошее предложение! Но поскольку он зависит от NodeJS, я не могу использовать его сегодня. Решение @Laurenz Albe хорошо подходит для моего случая, потому что оно более гибкое, я могу использовать собственные команды PostgreSQL и Linux. –