web-dev-qa-db-ja.com

コマンドラインからのPostgreSQL CSVインポート

私はpsql Postgresターミナルを使用して、次を使用してCSVファイルをテーブルにインポートしました

COPY tbname FROM
'/tmp/the_file.csv'
delimiter '|' csv;

これは、psqlターミナルにログインして実行する必要があることを除いて、正常に動作します。

Postgresが以下のようなシェルコマンドを許可する方法に似たLinuxシェルコマンドラインからこれに似たコマンドを実行する方法を誰かが知っているかどうかを知りたい

/opt/postgresql/bin/pg_dump dbname > /tmp/dbname.sql

これにより、psqlターミナルにログインせずにLinuxシェルからデータベースをダンプできます。

31

PostgreSQLドキュメント( II。PostgreSQLクライアントアプリケーション-psql )に記載されているように、スイッチ-cを使用してpsqlにコマンドを渡すことができます。

psql -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"
33
Simo Kivistö

受け入れられた回答のソリューションはサーバー上でのみ機能し、クエリを実行するユーザーが this SO answer

それ以外の場合、より柔軟なアプローチは、SQLのCOPYコマンドを\copyと呼ばれる psqlの「メタコマンド」に置き換えることです which これはすべて同じオプションを取ります「実際の」COPYとしてですが、クライアント内部で実行されます (最後に;を必要としません):

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"

ドキュメントごと\copyコマンド:

フロントエンド(クライアント)コピーを実行します。これはSQL COPYコマンドを実行する操作ですが、サーバーが指定されたファイルを読み書きする代わりに、psqlはファイルを読み書きし、サーバーとローカルファイルシステム間でデータをルーティングします。これは、ファイルのアクセス可能性と特権がサーバーではなくローカルユーザーのものであり、SQLスーパーユーザー特権が必要ないことを意味します。


さらに、the_file.csvの最初の行にヘッダーが含まれている場合、上記のコマンドの最後にheaderを追加することで認識できます。

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"
33
Dmitri Zaitsev

最も柔軟な方法は、シェルHERE documentを使用すると、クエリ内で(二重引用符または単一引用符内でも)シェル変数を使用できます。

#!/bin/sh

THE_USER=moi
THE_DB=stuff
THE_TABLE=personnel
PSQL=/opt/postgresql/bin/psql
THE_DIR=/tmp
THE_FILE=the_file.csv

${PSQL} -U ${THE_USER} ${THE_DB} <<OMG
COPY ${THE_TABLE} FROM '${THE_DIR}/${THE_FILE}' delimiter '|' csv;
OMG
8
wildplasser

前の answer を完了するには、次のことをお勧めします。

psql -d your_dbname --user=db_username -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"
6
Andrea Araldo