部署到Heroku"ERROR:必须是超级用户才能复制到文件或从文件复制"

Kyl*_*han 9 ruby-on-rails heroku database-migration

在将应用程序的数据库推送到Heroku后,我遇到了迁移问题的问题.触发错误的代码部分如下:

execute "COPY countries FROM '#{Rails.root}/db/migrate/Countries.txt' DELIMITER ',' CSV HEADER;"
execute "COPY regions FROM '#{Rails.root}/db/migrate/Regions.txt' DELIMITER ',' CSV HEADER;"
execute "COPY cities FROM '#{Rails.root}/db/migrate/Cities.txt' DELIMITER ',' CSV HEADER;"
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

PG :: InsufficientPrivilege:错误:必须是超级用户才能复制到文件或从文件复制提示:任何人都可以复制到stdout或从stdin复制.psql的\ copy命令也适用于任何人.:COPY countries FROM'/ app/db/migrate/Countries.txt'DELIMITER','CSV HEADER; 耙子流产了!发生错误,此以及所有后续迁移都已取消:

到目前为止,我已经尝试使用"\ copy"和"COPY FROM STDIN"作为一些旧问题,但不断出现语法错误.如果有人能指出我正确的方向,那将是伟大的.

编辑:以下是我引用的问题.:

我试过这个:

execute "COPY countries FROM STDIN '#{Rails.root}/db/migrate/Countries.txt' DELIMITER ',' CSV HEADER;"
Run Code Online (Sandbox Code Playgroud)

还有这个:

execute "COPY countries FROM '#{Rails.root}/db/migrate/Countries.txt' STDIN DELIMITER ',' CSV HEADER;"
Run Code Online (Sandbox Code Playgroud)

:

我试过这个:

execute \copy countries FROM STDIN '#{Rails.root}/db/migrate/Countries.txt' DELIMITER ',' CSV HEADER
Run Code Online (Sandbox Code Playgroud)

编辑二:

这是另一次尝试:

execute "COPY countries '#{Rails.root}/db/migrate/Countries.txt' FROM STDIN DELIMITER ',' CSV HEADER;"
execute "COPY regions '#{Rails.root}/db/migrate/Regions.txt' FROM STDIN DELIMITER ',' CSV HEADER;"
execute "COPY cities '#{Rails.root}/db/migrate/Cities.txt' FROM STDIN DELIMITER ',' CSV HEADER;"
Run Code Online (Sandbox Code Playgroud)

我从这里得到的错误是:

PG :: SyntaxError:错误:"'/app/db/migrate/Countries.txt'或附近的语法错误"第1行:COPY国家/ app /db /migrate/Countries.txt'来自STDIN DE ... ^ :COPY countries'/app/db/migrate/Countries.txt'FROM STDIN DELIMITER','CSV HEADER; 耙子流产了!发生错误,此以及所有后续迁移都已取消:

PG :: SyntaxError:错误:语法错误在''/app/db/migrate/Countries.txt'或附近"第1行:COPY国家'/app/db/migrate/Countries.txt'FROM STDIN DE ...

编辑3:

我无法解决我遇到的问题,但找到了一个更简单的解决方案 - 创建一个本地转储并使用他们的导入工具将其上传到heroku.哪个可以在这里找到.

akh*_*med 14

意识到这个问题相当陈旧,我将为后代的利益提供另一个答案,因为它是第一个出现在Google上的查询.我发现一个简单的解决方案是:

  • 暂时授予用户SUPERUSER权限.

(请注意,SUPERUSER是PostgreSQL标志,并不意味着您需要成为系统root用户).您需要psqlpostgres用户下运行以下内容:

alter user <username> superuser
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你将不再需要与之斗争\copySTDIN进口.这是一种非常快速有效的捷径(尽管有点危险).

执行导入后,您可以通过执行以下操作来撤消超级用户权限:

alter user <username> nosuperuser
Run Code Online (Sandbox Code Playgroud)

此解决方案的灵感来自于这个答案.

  • "必须是超级用户才能改变超级用户".现在我该怎么做? (3认同)

Fra*_*cke 5

通过stdin为我工作...(诚然,从命令行.内容的奇怪逃避是Windows-ish)

cat import.csv | psql -c "COPY cms.\"Contents\" FROM stdin DELIMITER ',' ...
Run Code Online (Sandbox Code Playgroud)


Rya*_*igg 2

正如错误所示:您不是超级用户,无法从文件中复制。

正如错误所述,您的语法错误是由于您使用无效语法造成的。您无法从 Heroku 上的文件进行复制,因此您将不得不使用其他解决方案。

这里的答案就是我建议做的事情。