Импорт данных из CSV в PSQL

#ruby-on-rails #postgresql #csv

#ruby-на-рельсах #postgresql #csv-файл

Вопрос:

Я пытаюсь импортировать данные из 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 без его взлома? Я просмотрел множество документов и сообщение об ошибке, но пока не нашел решения своей проблемы.

Спасибо!

Комментарии:

1. Что происходит, когда вы предоставляете подобное COPY manjadata FROM '/filepath/data.csv' WITH (FORMAT csv, DELIMITER ','); ?

2. Если у меня нет обратной косой черты перед копированием, как в COPY , я получаю сообщение об ошибке «не удалось открыть файл «… путь к файлу …» для чтения: отказано в разрешении . If I add the КОПИРОВАТЬ», я получаю сообщение об ошибке ERROR: invalid input syntax for integer: "address" CONTEXT: COPY data, line 1, column id: "address"

3. Где вы находите этот синтаксис? Я видел много много в SO, все без обратной косой черты перед копированием.

4. И вы должны указать заголовки с HEADERS true помощью команды.

5. @Pavan он ломается, даже если я удаляю заголовки. Обратная косая черта, которую я обнаружил при поиске сообщения об ошибке could not open file "...filepath..." for reading: Permission denied

Ответ №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 , и база данных заполнена данными, которые мне нужны 🙂