如何通过Rake任务将本地CSV文件导入Heroku Rails应用的PostgreSQL?
本地CSV导入Heroku PostgreSQL的解决方案
Heroku的Dyno无法直接访问本地电脑的文件系统,以下是三种可行的解决方法:
方法1:上传本地文件到Heroku临时存储后执行Rake任务
先把本地CSV文件传到Heroku Dyno的临时目录,再运行你的Rake任务:
- 第一步:在本地终端执行,将本地CSV复制到Heroku Dyno指定路径:
(替换heroku ps:copy ./本地文件路径/familias.csv tmp/storage/familias.csv --app 你的Heroku应用名./本地文件路径为你电脑上CSV的实际路径,你的Heroku应用名换成你的应用名称) - 第二步:进入Heroku的Bash会话并执行Rake任务:
在Bash会话内运行:heroku run bash --app 你的Heroku应用名
注意:Heroku Dyno的文件系统是临时的,重启后所有临时文件会被清除,导入完成后无需保留文件。rake import:family_data['tmp/storage/familias.csv']
方法2:用Heroku PostgreSQL CLI直接导入(更高效)
无需依赖Rake任务,用官方pg:copy命令直接批量导入数据:
heroku pg:copy ./本地文件路径/familias.csv DATABASE_URL --table families --columns id,name,description,discount,profit,created_at,updated_at --app 你的Heroku应用名
参数说明:
--table families:指定目标数据库表名(对应Family模型的复数表名)--columns:指定CSV列的顺序,需与数据库表字段完全匹配;如果CSV不含id列,可去掉id,部分,数据库会自动生成主键
方法3:修改Rake任务支持标准输入(无需上传文件)
调整Rake任务,让它可以读取标准输入的CSV内容,直接通过管道把本地文件内容传给Heroku:
修改后的Rake任务代码:
namespace :import do desc "Import Family Data (supports stdin or file path)" task :family_data, [:file_path] => :environment do |t, args| require "csv" puts "Importing Family Data" model = Family records = [] # 优先使用指定文件路径,否则读取标准输入 input = args[:file_path] ? File.open(args[:file_path]) : $stdin CSV.foreach(input, headers: true) do |row| records << model.new(row.to_hash) end puts "#{records.count} records to import" model.import!(records) puts "Imported #{model.count} #{model.name.pluralize}" end end
在本地终端执行以下命令完成导入:
cat ./本地文件路径/familias.csv | heroku run rake import:family_data --app 你的Heroku应用名
内容的提问来源于stack exchange,提问作者Fernando Flores
相关产品推荐
相关产品推荐

