部署到Heroku"错误:必须是超级用户才能复制到文件或从文件复制#34;

时间:2014-03-17 02:52:47

标签: 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;"

这是我得到的错误:

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

到目前为止,我尝试使用“\ copy”和“COPY FROM STDIN”作为一些旧问题,但不断出现语法错误。如果有人能指出我正确的方向,那就太好了。

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

我试过了:

execute "COPY countries FROM STDIN '#{Rails.root}/db/migrate/Countries.txt' DELIMITER ',' CSV HEADER;"

和此:

execute "COPY countries FROM '#{Rails.root}/db/migrate/Countries.txt' STDIN DELIMITER ',' CSV HEADER;"

Two

我试过了:

execute \copy countries FROM STDIN '#{Rails.root}/db/migrate/Countries.txt' DELIMITER ',' CSV HEADER

编辑两个

这是另一次尝试:

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;"

我从中得到的错误是:

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

PG :: SyntaxError:ERROR:“'/app/db/migrate/Countries.txt'或附近的语法错误” 第1行:COPY国家'/app/db/migrate/Countries.txt'来自STDIN DE ...

编辑3:

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

6 个答案:

答案 0 :(得分:14)

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

  • 暂时授予用户SUPERUSER权力。

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

alter user <username> superuser

如果您这样做,则无需再与\copySTDIN进口战斗。这是一种非常快速有效的捷径(尽管有点危险)。

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

alter user <username> nosuperuser

此解决方案受到this回答的启发。

答案 1 :(得分:5)

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

cat import.csv | psql -c "COPY cms.\"Contents\" FROM stdin DELIMITER ',' ...

答案 2 :(得分:3)

根据Heroku,他们为postgres数据库创建的用户是在没有超级用户权限的情况下创建的。这意味着您没有复制权限。

将数据导入heroku数据库的推荐方法似乎是创建数据库转储并导入而不是使用COPY和csv文件。看看:https://devcenter.heroku.com/articles/heroku-postgres-import-export

答案 3 :(得分:2)

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

您的语法错误是您使用的结果,如错误所示,语法无效。您无法从Heroku上的文件中复制,因此您将不得不使用其他解决方案。

The answer here是我建议做的。

答案 4 :(得分:0)

刚刚为django应用程序进行了摔跤,我想我会分享我的解决方案。

  1. 在数据库中创建分段模式
  2. 在暂存中创建源数据表
  3. 导入数据
  4. 运行INSERT脚本以从登台表写入目标表
  5. 注意:我有登台模式来运行加载和转换。

答案 5 :(得分:0)

通过文档:

  

COPY命名文件只允许用于数据库超级用户,因为它允许读取或写入服务器有权访问的任何文件。

https://www.postgresql.org/docs/9.2/static/sql-copy.html

您可以通过以下步骤克服:

  1. 启动psql
  2. sudo -u postgres psql

    1. 让用户成为超级用户
    2. alter user [user] superuser;

      1. 检查用户是否为超级用户
      2. select usesuper from pg_user where usename = '[user]';

        P.S。不要忘记;