私は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シェルからデータベースをダンプできます。
PostgreSQLドキュメント( II。PostgreSQLクライアントアプリケーション-psql )に記載されているように、スイッチ-c
を使用してpsql
にコマンドを渡すことができます。
psql -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"
受け入れられた回答のソリューションはサーバー上でのみ機能し、クエリを実行するユーザーが 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"
最も柔軟な方法は、シェル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
前の answer を完了するには、次のことをお勧めします。
psql -d your_dbname --user=db_username -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"