UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【PostgreSQL】COPYコマンドを使ってローカルにあるcsvファイルをインポートしたい

PostgresのCOPY FROMコマンドを使ってcsvファイルをテーブルに読み込ませたい

さらにはpsqlにそのsqlを渡してコマンドラインで実行したい

実行環境

  • Postgresサーバーはdockerで起動している
  • psqlはローカルマシンにインストール済み

psqlsqlを実行する書式は以下なので

$ 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/