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/