Como usar COPY from con ruby y PG driver

by Gastón Ramos

Estoy trabajando en un proyecto dónde necesito importar unos archivos csv muy grandes, apróximadamenteunos 40 millones de registros cada uno, luego de varias pruebas con ruby, decidí usar COPY from, sencillamente por que el script de ruby demorarba unas 15hs mientras que el copy from 20 minutos, pasé por varios errores intentando correr el COPY from con Sequel uno de los errores decía que para correr COPY from file debo ser super usuario, y que podía usarCOPY from STDIN como usuario normal (error de PG) así que la forma que encontré de correr el copy from STDIN es usando directamente el driver de PG así:

class CopyCsvImporter

  def initialize(csv_file, args)
    @csv_file     = csv_file
    @separator    = args[:separator]
    @delete_table = args[:delete_table]
    @fields       = args[:fields]
    @table        = args[:table]
  end

  def copy_cmd
    "COPY #{@table} (#{@fields}) FROM STDIN DELIMITER '|'"
  end

  def conn
    conn_args = {:dbname => App.db_conf['database'], :user => App.db_conf['username'],
                 :password => App.db_conf['password'], :host => App.db_conf['host']}

    @conn ||= PG.connect conn_args
  end

  def import!
    conn.exec copy_cmd
    File.open(@csv_file) do|f|
      f.each_line{|line| conn.put_copy_data(line)}
    end
    conn.put_copy_end
  end

end

Preste atención sobre todo al método import. Esto fué todo!