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 CopyCsvImporterdef 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!