2017-07-27 5 views
0

PostgreSQLのSQL文で変数を作成しようとしましたが、機能しませんでした。 パスの下には多くのcsvファイルが格納されています。 Postgresqlでcsvファイルを見つけることができるコピーコマンドを伝えるパスを設定したい。PostgreSQLで変数をコピーするコマンドを渡す方法

SQL文サンプル:それは動作しませんでした

\set outpath '/home/clients/ats-dev/' 
\COPY licenses (_id, name,number_seats) FROM :outpath + 'licenses.csv' CSV HEADER DELIMITER ','; 
\COPY uploaded_files (_id, added_date) FROM :outpath + 'files.csv' CSV HEADER DELIMITER ','; 

。私はエラーがあります:そのようなファイルはありません。 licneses.csvとfiles.csvという2つのファイルは、Ubuntuの/ home/cilents/ats-devに格納されています。私は "\ set file 'license.csv'を使用するいくつかのsultionを見つけました。"それは私が多くのcsvファイルを持っているので私のために働かなかった。また私は "from:outpath || 'licenses.csv'"を使用しようとしました。それはエーテルを働かせなかった。助けを歓迎します。

9.3を使用する。

答えて

2

psqlは、 psqlバックスラッシュコマンド内での置換をサポートしていないようです。

test=> \set somevar fred 
test=> \copy z from :somevar 
:somevar: No such file or directory 

このようにするには、UNIXシェルのような外部ツールを使用する必要があります。例えば

for f in *.sql; do 
    psql -c "\\copy $(basename $f) FROM '$f'" 
done 
2

あなたはCOPYコマンド

\set outpath '\'/home/clients/ats-dev/' 
COPY licenses (_id, name,number_seats) FROM :outpath/licenses.csv' WITH CSV HEADER DELIMITER ','; 
COPY uploaded_files (_id, added_date) FROM :outpath/files.csv' WITH CSV HEADER DELIMITER ','; 

注意を試すことができます:COPYコマンドで指定されたファイルは読み取りまたはないクライアントアプリケーションによって、サーバによって直接書き込まれます。したがって、クライアントではなく、データベース・サーバー・マシン上に常駐するか、アクセス可能でなければなりません。クライアントではなく、PostgreSQLユーザ(サーバが実行するユーザID)によってアクセス可能で、読み書き可能でなければなりません。同様に、PROGRAMで指定されたコマンドは、クライアントアプリケーションではなくサーバによって直接実行され、PostgreSQLユーザによって実行可能でなければなりません。ファイルまたはコマンドに名前を付けるCOPYは、データベーススーパーユーザーにのみ許可されます。これは、サーバーがアクセス権を持つファイルの読み取りまたは書き込みを許可するためです。

ドキュメント:Postgresql 9.3 COPY

+0

お手数ですが、@ Anurag Paul。うまく行かなかった。 – user7070824

+0

COPYでは、ロールがスーパーユーザーであり、ファイルとpostgresqlが同じサーバー上に存在する必要があるため、少し制限があります。 –

関連する問題