You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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任务:
    heroku run bash --app 你的Heroku应用名
    
    在Bash会话内运行:
    rake import:family_data['tmp/storage/familias.csv']
    
    注意:Heroku Dyno的文件系统是临时的,重启后所有临时文件会被清除,导入完成后无需保留文件。

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:12:49