PostgreSQL 9.6 psqlの動作の非互換


PostgreSQL 9.6 psqlの非互換

PostgreSQL 9.6がリリースされてから2ヶ月以上経ちました。9.6でpsqlの動作が変わる変更が入っていることにお気づきでしょうか?

PostgreSQL 9.6のリリースノートにpsqlの変更点として以下のように書いてあります。

psqlの-cオプションはもはや--no-psqlrcの意味を含まなくなりました。

古い動作を得るには--no-psqlrc(または短縮形の-X)を明示的に書いてください。
 このように修正されたスクリプトは古いバージョンのpsqlでも引き続き動作するでしょう。

な、なんだってー

つまり、今まで psql -c "SELECT * FROM hogehoge;" と書いていたコマンドがpsqlrcファイルによって動作が変わってしまいます。
シェルスクリプトなんかで使用する時は-Xを入れておく方が良いでしょう。

まあ、psqlrcを読んでもそれほど影響無いかな...と思っていると、元々あった動作と組み合わさって以外な動作をすることになります。

例えば ~/.psqlrc に以下の文を入れていたりすると

\pset format wrapped
psql -Pformat=asciidoc -c "select *from test;" testdb

とasciidoc形式で出力しようとしても出力されません。

オプションの方が優先でない???

そーなんです。ずっと前のバージョンからpsqlはpsqlrcの方がオプションの後で解釈されるようになっていてオプションより優先されるようになっちゃっているのです。

-Xを付けるか、他のpsqlrcの内容を活かしつつ上記の変更をしたい場合、以下のようにすると出力されます。

psql -c "\pset format asciidoc" -c "select *from test;" testdb

そうなっちゃってるのはしょうがないので、とりあえず注意しましょう!