我正在尝试使用我正在下载到服务器的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配置问题吗?
答案 0 :(得分:1)
如果要将客户端的 CSV 中的数据复制到服务器,那么应该没有问题。您可以使用 psql 客户端及其{来完全在 Ruby 之外,如果您愿意,或者您可以从 Ruby 中进行外壳)。 {1}}命令。由于它在本地文件系统之外运行,只要您可以访问本地文件路径,就不会有任何问题。
要在服务器上复制 CSV ,您必须是超级用户,如错误所示。
基于this answer, postgres 用户似乎在 Engineyard 中配置为超级用户,因此,你使用那个用户,你应该没问题。
这需要与 Rails 中的常规应用连接建立单独的连接,因为这可能不会使用 postgres 用户,而是您为应用创建的任何用户(由于各种原因,您的应用通常不应使用超级用户权限运行)。
除非这是 服务器端的某种自动化工作流程的一部分,否则我建议您使用\copy
从您的框中使用 psql