【问题标题】:Importing Data from CSV to PSQL将数据从 CSV 导入 PSQL
【发布时间】:2014-06-29 03:34:13
【问题描述】:

我正在尝试将数据从 CSV 导入 PSQL 数据库。我找到了一个很好的例子,说明如何在堆栈溢出时从 csv 复制数据,如下所示(只有文件路径不同)。

\COPY manjadata FROM '/filepath/data.csv' DELIMITER ',' CSV;

但是,这在第一行中断,给我错误消息:

ERROR:  invalid input syntax for integer: "address"
CONTEXT:  COPY data, line 1, column id: "address"

我的表设置如下:

class Data < ActiveRecord::Migration
  def change
     create_table :data do |t|
      t.string :address
      t.string :city
      t.string :state
      t.integer :zip
      t.string :name

      t.timestamps
    end
  end
end

CSV 如下所示:

address,city,state,zip,name,url
211 Hanover St,Boston,MA,2113,Mother Anna's,http://motheranna.com/
226 Hanover St,Boston,MA,2113,Lucca,http://www.luccaboston.com/
227 Hanover St,Boston,MA,2113,Cobblestone,http://www.CobblestoneNe.com

如何将此 csv 导入 psql 数据库而不破坏它?我查找了很多文档和错误消息,但还没有找到解决我的问题的方法。

谢谢!

【问题讨论】:

  • 当你这样给COPY manjadata FROM '/filepath/data.csv' WITH (FORMAT csv, DELIMITER ',');时会发生什么?
  • 如果我在复制之前没有反斜杠\COPY,我会收到错误消息“无法打开文件“...文件路径...”进行阅读:权限被拒绝. If I add the \COPY` 我收到错误消息ERROR: invalid input syntax for integer: "address" CONTEXT: COPY data, line 1, column id: "address"
  • 你在哪里找到那个语法?我在 SO 中看到了很多,在 COPY 之前都没有反斜杠。
  • 而且你必须在命令中用HEADERS true指定标题。
  • @Pavan 即使我删除了标题,它也会中断。查找错误消息时发现的反斜杠could not open file "...filepath..." for reading: Permission denied

标签: ruby-on-rails postgresql csv


【解决方案1】:

您可以尝试运行以下命令以使用以下 CSV 导入数据

address,city,state,zip,name
211 Hanover St,Boston,MA,2113,Mother Anna's
226 Hanover St,Boston,MA,2113,Lucca
227 Hanover St,Boston,MA,2113,Cobblestone

命令

 \COPY data(address,city,state,zip,name) FROM 'path/data.csv' DELIMITER ',' CSV header;

请注意,url 已从 CSV 中删除,因为它不存在于数据库中

【讨论】:

    【解决方案2】:

    我最终只是使用种子文件导入数据,如下所示:

    seeds.rb内部:

    require 'csv'
    
    datafile = Rails.root + 'db/data.csv'
    
    CSV.foreach(datafile, headers: true) do |row|
    
      Data.find_or_create_by({address: row[0]}) do |hr|
        hr.address = row[0]
        hr.city =  row[1]
        hr.state =  row[2]
        hr.zip =  row[3]
        hr.name =  row[4]
      end
    
    end
    

    然后我简单地将我的data.csv 放入db 文件夹中,CSV 格式相同(如下):

    address,city,state,zip,name
    211 Hanover St,Boston,MA,2113,Mother Anna's,http://motheranna.com/
    226 Hanover St,Boston,MA,2113,Lucca,http://www.luccaboston.com/
    227 Hanover St,Boston,MA,2113,Cobblestone,http://www.CobblestoneNe.com
    

    最后,我跑了rake db:seed,数据库里填满了我需要的数据:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多