首页 > 解决方案 > 使用 Ruby on Rails 将许多 CSV 文件导入 PostgreSQL 数据库

问题描述

我正在尝试将一大堆 csv 文件导入到 postgreSQL 数据库中。CSV 文件的格式如下所示。我希望能够在 html 文件之间交换并显示每个县的不同统计数据(表格)。

County,Number,Statistic,Year,Source,
Atlantic;403;Assualt;2010;https://www.njsp.org/ucr/uniform-crime-reports.shtml
Bergen;529;
Burlington;267;
Camden;859;
Cape May;160;
Cumberland;300;
Essex;1275;
Glouchester;209;
Hudson;838;
Hunterdon;38;
Mercer;416;
Middlesex;519;
Monmouth;442;
Morris;202;
Ocean;322;
Passaic;852;
Salem;67;
Somerset;73;
Sussex;53;
Union;421;
Warren;453;

有一堆 csv 文件,其中我跟踪的统计数据不同,即攻击、盗窃等。有没有办法导入所有这些 csv 文件并在执行此操作时创建一个表?还是在 schema.rb 文件中创建一个表,然后在 seed.rb 文件中运行某种脚本会更好?

标签: ruby-on-railsrubydatabasepostgresqlcsv

解决方案


当可以使用 Rails ORM 时,Rails 约定建议不要编写原始 sql -ActiveRecord

通常在 Rails 中,您应该创建迁移,在其中定义表结构并定义名称与表匹配的 ActiveRecord 模型,例如CountyStat

class CreateCountyStats < ActiveRecord::Migration[5.0]
  def change
    create_table :county_stats do |t|
      t.string :county, index: true
      t.integer :number
      t.string :statistic
      t.text :source

 
      t.timestamps
    end
  end
end

然后你需要解析给定的 CSV,并导入数据库。 seeds.rb主要使用一次,在初始应用程序设置期间,您可以将其包装在rake task中。

CSV.foreach(csv_path, headers: true) do |row|
  attributes = row.to_h.transform_keys(&:downcase)

  CountyStat.create(attributes)
end

之后,您可以使用 ActiveRecord 模型获取数据。如果您需要按某个列搜索,您可以添加索引(我已经为县提供了),您也可以为您的县定义范围(如果需要)

class CountyStat
  scope :bergen, -> { where(county: "Bergen" }
end

推荐阅读