1

サーバーにダウンロードしている CSV ファイルで PostgreSQL データベースを更新しようとしています。何時間も試してみましたが、ローカルでは完全に機能しますが、サーバー上では機能しません。これが私のコマンドです:

path = "/data/reporting/releases/20150202181737/data/storyboards.csv"

sql = "COPY storyboards (id, name, category, service_line, account_id, account_name, account_salesforce_id, banner_image) FROM \'#{path}\' DELIMITER ',' CSV;"

ActiveRecord::Base.connection.execute(sql)

エラーメッセージは次のとおりです。

COPY storyboards (id, name, category, service_line, account_id, account_name, account_salesforce_id, banner_image) FROM '/data/reporting/releases/20150202181737/data/storyboards.csv' DELIMITER ',' CSV;
PG::InsufficientPrivilege: ERROR:  must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
: COPY storyboards (id, name, category, service_line, account_id, account_name, account_salesforce_id, banner_image) FROM '/data/reporting/releases/20150202181737/data/storyboards.csv' DELIMITER ',' CSV;
ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR:  must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
: COPY storyboards (id, name, category, service_line, account_id, account_name, account_salesforce_id, banner_image) FROM '/data/reporting/releases/20150202181737/data/storyboards.csv' DELIMITER ',' CSV;

これをやろうとしたのは私だけではないと確信しているので、この問題の解決策をお勧めできますか。Engineyard でアプリをホストしています。これは Engineyard の構成の問題ですか?

4

1 に答える 1

1

クライアント側のCSVからサーバーにデータをコピーする場合、問題はありません。psqlクライアントとそのコマンドを使用して、これを行うことができます (必要に応じて完全にRubyの外部で実行するか、 Ruby内からシェルアウトすることもできます)。ローカル ファイル システムで動作するため、ローカル ファイル パスにアクセスできる限り問題はありません。\copy

サーバーにCSVをコピーするには、エラーが示すようにスーパーユーザーである必要があります。

この回答に基づいて、postgresユーザーはEngineyardでスーパーユーザーになるように構成されているように見えるため、そのユーザーを使用しても問題ありません。

これには、 Railsでの通常のアプリ接続とは別の接続が必要になります。これは、おそらくpostgresユーザーを使用するのではなく、アプリ用に作成したユーザーを使用するためです (通常、アプリはさまざまな理由でスーパーユーザー権限で実行されるべきではないため)。 .

これがサーバー側でなければならないある種の自動化されたワークフローの一部でない限り、ボックスからpsql\copyを.

于 2015-02-02T23:07:27.487 に答える