如何在从rails导入CSV到postgres时使用COPY时添加另一列

时间:2017-08-25 18:58:32

标签: ruby-on-rails postgresql csv

我正在将CSV文件导入名为import_csv

的表格中

该表格包含first_name, last_name, email, phone_number, organization_id

我使用以下代码导入CSV

file = params[:file]
  filePath = file.path
  fileName = File.basename filePath

  pg = ActiveRecord::Base.connection
  rc = pg.raw_connection
  rc.exec("COPY import_csv (first_name, last_name, email, phone_number) FROM STDIN WITH CSV")

  file = File.open(filePath)
  file::gets

  while !file.eof?
    # Add row to copy data
    rc.put_copy_data(file.readline)
  end

我想知道如何设置organization_id字段,而不必将其放入我要导入的.CSV文件中。

2 个答案:

答案 0 :(得分:0)

  1. 按原样将csv文件导入新表。

  2. 现在,带有ADD COLUMN命令的修改表模式:

    rc = pg.raw_connection

    ...

    rc.exec(“ALTER TABLE import_csv ADD COLUMN organization_id integer;”)

  3. 现在应该这样做。

答案 1 :(得分:0)

我能够通过在COPY命令之前修改CSV来找到解决方法,如下所示:

require 'csv'

  # Load the original CSV file
  rows = CSV.read(filePath, headers: true).collect do |row|
    hash = row.to_hash
    hash.merge('phone_number' => '0')
    hash.merge('a1' => hash['organization_id'].to_s + '#{organization_id}' )
  end

  # Extract column names from first row of data
  column_names = rows.first.keys
  txt = CSV.generate do |csv|
    csv << column_names
    rows.each do |row|
      # Extract values for row of data
      csv << row.values
    end
  end

这使我可以添加组织ID,而无需将其添加到CSV中。

如果有人有任何更好的建议,请告诉我,因为在导入21,000条记录时,只需重写就会将从0.045868导入的时间从0.858213秒导入