ローカルファイルからリモートデータベースにコピーする

postgresql soci sqlbulkcopy

質問

同様の質問がありますが、私の問題には対処できませんでした。私はリモートデータベースにストアドプロシージャを定義しています。その操作の一部として、SPはローカルファイルから(私のローカルマシン上で実行されている私のアプリケーションを通して)一括して挿入する必要があります:手順:

CREATE OR REPLACE FUNCTION upsert_realtime(path text, traveltime_table regclass)
  RETURNS void AS
$BODY$
BEGIN   
    EXECUTE format('COPY temp_table(link_id,start_time,end_time,travel_time,interval_time, travel_mode) FROM %L DELIMITER '';'' CSV', path);
    --...     
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION upsert_realtime(text, regclass)
  OWNER TO postgres;

SPに供給されるパスはローカルマシン上にあります。

select * from upsert_realtime('/home/.../travel_time.txt','realtime_travel_time');

したがって、私はこのエラーが発生します:

terminate called after throwing an instance of 'soci::postgresql_soci_error'
  what():  Cannot execute query. ERROR:  could not open file "/home/.../travel_time.txt" for reading: No such file or directory

私の頭に浮かぶ唯一のことは、何とか自動的にpostgresqlサーバーにファイルをscpし、SPを実行することです。これはベスト・アイデアではありません。解決策を見つける手助けはできますか?どうもどうも

受け入れられた回答

間違ったパスを使用しています 。これは一般的なエラーの原因です。それはすべて「サーバーの観点から」です。

ファイル名を指定してCOPYすると、PostgreSQLサーバはファイルを直接読み書きするように指示します。ファイルはPostgreSQLユーザ(サーバが実行するユーザID)からアクセス可能でなければならず、サーバの観点から名前を指定する必要があります。 PROGRAMが指定されると、サーバーは指定されたコマンドを実行し、プログラムの標準出力から読み取り、またはプログラムの標準入力に書き込みます。コマンドはサーバの観点から指定し、PostgreSQLユーザが実行できるようにする必要があります。 STDINまたはSTDOUTを指定すると、クライアントとサーバー間の接続を介してデータが送信されます。

使用可能なパスがない場合は、

  • ファイルをサーバーに移動し、正しいパスを使用して、
  • ローカルファイルにアクセスできるサーバー上のプログラムを起動し、
  • psqlを使用してリモートサーバに接続し、ローカルファイルを読み込みます。


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ