動機
pg_dumpでダンプしたバックアップファイル(=クエリの連続)の中で以下のDDLのクエリをコメントアウトしたい。
CREATE SERVER ~
CREATE FOREIGN TABLE ~
難しいのは、クエリが改行されて複数行にまたぐことがあること。
やり方
CREATE SERVER ~
をコメントアウト
queries.sql
CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');
CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'foo', dbname 'foodb', port '5432');
- $
cat queries.sql | sed -e "/^CREATE SERVER.*;$/ s|^|-- |; /^CREATE SERVER/, /.*;$/ s|^|-- |"
- $
cat queries.sql | sed -e "/^CREATE SERVER.*;$/ s|^|-- |" | sed -e "/^CREATE SERVER/, /.*;$/ s|^|-- |"
のいずれかにより、
-- CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');
-- CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw
-- OPTIONS (host 'foo', dbname 'foodb', port '5432');
CREATE FOREIGN TABLE ~
をコメントアウト
queries.sql
CREATE FOREIGN TABLE films (code char(5) NOT NULL, title varchar(40) NOT NULL) SERVER film_server;
CREATE FOREIGN TABLE films (
code char(5) NOT NULL,
title varchar(40) NOT NULL,
did integer NOT NULL,
date_prod date,
kind varchar(10),
len interval hour to minute
)
SERVER film_server;
- $
cat queries.sql | sed -e "/^CREATE FOREIGN TABLE.*;$/ s|^|-- |; /^CREATE FOREIGN TABLE/, /.*;$/ s|^|-- |"
- $
cat queries.sql | sed -e "/^CREATE FOREIGN TABLE.*;$/ s|^|-- |" | sed -e "/^CREATE FOREIGN TABLE/, /.*;$/ s|^|-- |"
のいずれかにより、
-- CREATE FOREIGN TABLE films (code char(5) NOT NULL, title varchar(40) NOT NULL) SERVER film_server;
-- CREATE FOREIGN TABLE films (
-- code char(5) NOT NULL,
-- title varchar(40) NOT NULL,
-- did integer NOT NULL,
-- date_prod date,
-- kind varchar(10),
-- len interval hour to minute
-- )
-- SERVER film_server;
これらを一気に行うには、
function sed_exp(){
echo "/^$1.*;$/ s|^|-- |; /^$1/, /.*;$/ s|^|-- |"
}
cat queries.sql | sed -e "$(sed_exp "CREATE SERVER")" | sed -e "$(sed_exp "CREATE FOREIGN TABLE")"
これにより、
-- CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');
-- CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');
-- CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw
-- OPTIONS (host 'foo', dbname 'foodb', port '5432');
-- CREATE FOREIGN TABLE films (code char(5) NOT NULL, title varchar(40) NOT NULL) SERVER film_server;
-- CREATE FOREIGN TABLE films (
-- code char(5) NOT NULL,
-- title varchar(40) NOT NULL,
-- did integer NOT NULL,
-- date_prod date,
-- kind varchar(10),
-- len interval hour to minute
-- )
-- SERVER film_server;
限界
以上のやり方だと、以下の事象が発生する。
- 文末の
;
の後にコメントがある場合にその続きもコメントアウトされてしまう。 - 文末の
;
の後にコメントがあり、その最後の一文字が;
の場合にそこまでしかコメントアウトされない。
しかし、pg_dump
により生成されたファイルに関してこれらは起こらなそうなので一旦よしとする。
参考
のやり方をそのまま使った。