如何将CSV批量数据导入Heroku Postgres?权限报错解决
解决Heroku Postgres批量导入CSV时的权限错误
问题核心
使用COPY FROM本地文件导入Heroku Postgres时触发权限报错:
SQL Error [42501]: ERROR: must be superuser or have privileges of the pg_read_server_files role to COPY from a file
Hint: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone
本地Postgres能正常执行该命令,是因为本地环境下你是超级用户;但Heroku作为托管Postgres服务,会限制超级权限,不允许数据库服务器直接读取你的本地文件。
解决方案
方案1:使用psql的\copy客户端命令
\copy是psql的客户端命令,会先在本地读取CSV文件,再将数据发送到Heroku服务器,不需要服务器端的文件读取权限:
- 打开终端,通过Heroku CLI连接到你的Postgres实例:
heroku pg:psql -a 你的应用名称 - 连接成功后,执行导入命令(需指定表的列,因为CSV第一列是序号,你的表无对应字段):
\copy nlg_recipe(title, ingredients, directions, link, source, NER) FROM '/Users/Container/data_sets/nlg_recipe_dataset.csv' DELIMITER ',' CSV HEADER;
方案2:用DBeaver内置的导入工具
既然已通过DBeaver连接Heroku数据库,可直接用可视化导入功能:
- 在DBeaver导航栏找到
nlg_recipe表,右键选择「导入数据」 - 选择本地CSV文件,在配置界面确认:
- 分隔符设为逗号
, - 勾选「使用表头」
- 在「映射」步骤中,将CSV的
title、ingredients等列对应到表的同名字段,忽略CSV第一列的序号
- 分隔符设为逗号
- 点击开始导入即可
注意事项
你的CSV第一列为行号(0、1、2...),但nlg_recipe表无对应字段,因此导入时必须明确指定要导入的列,避免因列数不匹配报错。
内容的提问来源于stack exchange,提问作者Ahmad Mujtaba
相关产品推荐
相关产品推荐

