PostgresのCOPY FROMコマンドを使ってcsvファイルをテーブルに読み込ませたい
さらにはpsqlにそのsqlを渡してコマンドラインで実行したい
実行環境
- Postgresサーバーはdockerで起動している
- psqlはローカルマシンにインストール済み
$ psql "データベース接続情報" -c "SQL文"
シンプルに次のようにすればよさそう
$ psql "host=localhost port=5432 dbname=postgres user=postgres password=postgres" -c "\COPY TARGET_TABLE FROM './sample.csv'"
このときハマったのが、COPY コマンドと \COPY コマンドの違いによるファイルのパスの書き方
ドキュメントによると
COPYはpsqlの\copyとは異なるものであることに注意してください。 \copyはCOPY FROM STDINやCOPY TO STDOUTを呼び出し、psqlクライアントからアクセスできるファイルにデータの書き込み/読み込みを行います。 したがって、\copyコマンドでは、ファイルへのアクセスが可能かどうかと、ファイルに対するアクセス権限の有無は、サーバではなくクライアント側に依存します。
https://www.postgresql.jp/document/9.3/html/sql-copy.html
つまり COPY コマンドは、PostgreSQL データベースが稼働しているサーバー上のファイルの入出力を行うためのものなので、dockerコンテナ内のファイルパスにする必要がある
一方 \COPY はデータベース接続を行ったクライアント側でファイルの入出力を行うものなので、ホストマシンのファイルパスにする
今回はホストマシンにファイルがあるので\COPYを使ったらできた
参考
http://everything-you-do-is-practice.blogspot.com/2017/10/postgresql-copy.html
https://dev.classmethod.jp/articles/postgresql-copy-commanad/