从服务器上的CSV复制到PostgreSQL数据库

时间:2015-02-02 21:54:38

标签: ruby database postgresql csv engineyard

我正在尝试使用我正在下载到服务器的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配置问题吗?

1 个答案:

答案 0 :(得分:1)

如果要将客户端的 CSV 中的数据复制到服务器,那么应​​该没有问题。您可以使用 psql 客户端及其{来完全在 Ruby 之外,如果您愿意,或者您可以从 Ruby 中进行外壳)。 {1}}命令。由于它在本地文件系统之外运行,只要您可以访问本地文件路径,就不会有任何问题。

要在服务器上复制 CSV ,您必须是超级用户,如错误所示。

基于this answer postgres 用户似乎在 Engineyard 中配置为超级用户,因此,你使用那个用户,你应该没问题。

这需要与 Rails 中的常规应用连接建立单独的连接,因为这可能不会使用 postgres 用户,而是您为应用创建的任何用户(由于各种原因,您的应用通常不应使用超级用户权限运行)。

除非这是 服务器端的某种自动化工作流程的一部分,否则我建议您使用\copy从您的框中使用 psql