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