将应用程序的数据库推送到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。
答案 0 :(得分:14)
意识到这个问题相当陈旧,我会为后代的利益提供另一个答案,因为它是第一个出现在Google上的查询。我找到的一个简单的解决方案是:
(请注意,SUPERUSER是PostgreSQL标志,并不意味着您需要成为系统root用户)。您需要在psql
用户下的postgres
中运行以下内容:
alter user <username> superuser
如果您这样做,则无需再与\copy
或STDIN
进口战斗。这是一种非常快速有效的捷径(尽管有点危险)。
完成导入后,您可以通过执行以下操作撤消超级用户权限:
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应用程序进行了摔跤,我想我会分享我的解决方案。
注意:我有登台模式来运行加载和转换。
答案 5 :(得分:0)
通过文档:
COPY命名文件只允许用于数据库超级用户,因为它允许读取或写入服务器有权访问的任何文件。
https://www.postgresql.org/docs/9.2/static/sql-copy.html
您可以通过以下步骤克服:
sudo -u postgres psql
alter user [user] superuser;
select usesuper from pg_user where usename = '[user]';
P.S。不要忘记;