Heroku Postgres通过CLI导入本地CSV遇阻求助
本地CSV导入Heroku PostgreSQL的实用方案
嘿,我完全懂你这种只能靠本地CSV导数据的无奈!之前帮朋友解决过一模一样的问题,给你几个亲测有效的办法,避开超级用户权限的坑:
方案一:用Heroku CLI自带的pg:copy(最省心)
这是Heroku官方推荐的方式,不需要折腾权限,一步到位:
- 先确保你本地装了Heroku CLI,并且已经登录:
heroku login - 直接运行导入命令,替换成你的文件路径和应用名:
heroku pg:copy /path/to/your/local/file.csv DATABASE_URL --app your-heroku-app-name - 如果你的CSV有表头,或者分隔符不是默认的逗号,可以加参数调整:
(heroku pg:copy /path/to/file.csv DATABASE_URL --app your-app-name --header --delimiter ','--header表示第一行是表头,--delimiter指定字段分隔符,比如制表符就用'\t')
方案二:用psql客户端的\COPY命令(灵活可控)
你之前试的管道输入思路是对的,但应该用**客户端侧的\COPY**而不是SQL的COPY(后者才需要超级用户):
- 先获取Heroku数据库的连接地址:
复制输出里那个heroku pg:credentials:url --app your-app-namepostgres://xxxx开头的完整URL - 用管道把CSV内容传给psql,执行
\COPY:
这里要注意:cat /path/to/your/file.csv | psql <你的数据库URL> -c "\COPY your_target_table_name FROM stdin WITH (FORMAT csv, HEADER true, DELIMITER ',');"- 替换
your_target_table_name为你要导入的表名 HEADER true如果你的CSV没有表头就改成false- 可以根据CSV情况调整参数,比如
QUOTE '"'指定引号字符,ESCAPE '\'指定转义符
- 替换
方案三:大文件先传容器再导入(适合超大CSV)
如果你的CSV文件特别大,直接本地管道可能卡壳,可以先把文件传到Heroku应用的临时容器里:
- 进入Heroku应用的容器终端:
heroku ps:exec --app your-app-name - 打开本地另一个终端,把CSV传到容器的
/tmp目录:scp /path/to/local/file.csv heroku@your-app-name:/tmp/file.csv - 回到容器终端,用psql导入:
psql $DATABASE_URL -c "\COPY your_target_table_name FROM '/tmp/file.csv' WITH (FORMAT csv, HEADER true);" - 导入完成后记得删掉临时文件,避免占用空间:
rm /tmp/file.csv
几个关键注意事项
- 提前确保目标表已经创建好,表的列数、数据类型要和CSV对应,不然会报字段不匹配的错误
- 如果CSV里有特殊字符(比如换行、逗号),一定要用双引号把字段包裹起来,不然导入会出错
- 可以先拿一小部分数据测试,比如用
head -100 /path/to/file.csv | ...,没问题再全量导入
内容的提问来源于stack exchange,提问作者dgwebb
相关产品推荐
相关产品推荐

