Я хочу скопировать файл CSV в таблицу Postgres. В этой таблице около 100 столбцов, поэтому я не хочу их переписывать, если в этом нет необходимости.
Я использую \copy table from 'table.csv' delimiter ',' csv;
команду, но без созданной таблицы получаю ERROR: relation "table" does not exist
. Если я добавлю пустую таблицу, я не получу ошибки, но ничего не произойдет. Я пробовал эту команду два или три раза, и не было вывода или сообщений, но таблица не обновлялась, когда я проверял ее через PGAdmin.
Есть ли способ импортировать таблицу с включенными заголовками, как я пытаюсь сделать?
postgresql
csv
postgresql-copy
Кубок Стэнли Фил
источник
источник
table
? Очень запутанно. Таблица существует или вы хотите создать ее на основе CSV? (вы не можете)\copy table(column1, column2, ...) from 'table.csv' delimiter ',' csv;
. В идеале таблица могла бы быть создана только с помощью CSV и использовать заголовки в этом файле.Ответы:
Это сработало. В первой строке были имена столбцов.
источник
COPY
не создает таблицу и не добавляет в нее столбцы, он добавляет строки в существующую таблицу с ее существующими столбцами. Предположительно, запрашивающий хочет автоматизировать создание ~ 100 столбцов иCOPY
не имеет этой функции, по крайней мере, с PG 9.3.ADD
данные.syntax error at or near "HEADER" LINE 2: delimiter ',' CSV HEADER
на красное смещение AWS.С помощью библиотеки Python
pandas
вы можете легко создавать имена столбцов и выводить типы данных из файла csv.if_exists
Параметр может быть установлен , чтобы заменить или добавить в существующую таблицу, напримерdf.to_sql('pandas_db', engine, if_exists='replace')
. Это также работает для дополнительных типов входных файлов, документы здесь и здесь .источник
pd.read_excel
вместоpd.read_csv
. Я обновил ответ.df.to_sql()
это ОЧЕНЬ МЕДЛЕННО, для ускорения вы можете использовать d6tstack . Он также заботится об изменении схемы.Альтернатива терминалу без разрешения
Документация pg в ЗАМЕТКАХ говорит
Итак, вообще, при использовании
psql
любого клиента, даже на локальном сервере, у вас есть проблемы ... И, если вы выражаете команду COPY для других пользователей, например. в Github README у читателя возникнут проблемы ...Единственный способ выразить относительный путь с разрешениями клиента - использовать STDIN ,
как здесь помнят :
psql -h remotehost -d remote_mydb -U myuser -c \ "copy mytable (column1, column2) from STDIN with delimiter as ','" \ < ./relative_path/file.csv
источник
Некоторое время пользуюсь этой функцией без проблем. Вам просто нужно предоставить числовые столбцы, которые есть в файле csv, и он возьмет имена заголовков из первой строки и создаст для вас таблицу:
create or replace function data.load_csv_file ( target_table text, -- name of the table that will be created csv_file_path text, col_count integer ) returns void as $$ declare iter integer; -- dummy integer to iterate columns with col text; -- to keep column names in each iteration col_first text; -- first column name, e.g., top left corner on a csv file or spreadsheet begin set schema 'data'; create table temp_table (); -- add just enough number of columns for iter in 1..col_count loop execute format ('alter table temp_table add column col_%s text;', iter); end loop; -- copy the data from csv file execute format ('copy temp_table from %L with delimiter '','' quote ''"'' csv ', csv_file_path); iter := 1; col_first := (select col_1 from temp_table limit 1); -- update the column names based on the first row which has the column names for col in execute format ('select unnest(string_to_array(trim(temp_table::text, ''()''), '','')) from temp_table where col_1 = %L', col_first) loop execute format ('alter table temp_table rename column col_%s to %s', iter, col); iter := iter + 1; end loop; -- delete the columns row // using quote_ident or %I does not work here!? execute format ('delete from temp_table where %s = %L', col_first, col_first); -- change the temp table name to the name given as parameter, if not blank if length (target_table) > 0 then execute format ('alter table temp_table rename to %I', target_table); end if; end; $$ language plpgsql;
источник
set schema 'data';
к тому , что это дело для васВы можете использовать d6tstack, который создает таблицу для вас и работает быстрее, чем pd.to_sql (), потому что он использует собственные команды импорта БД. Он поддерживает Postgres, а также MYSQL и MS SQL.
Это также полезно для импорта нескольких CSV, решения изменений схемы данных и / или предварительной обработки с помощью pandas (например, для дат) перед записью в db, см. Далее в блокноте с примерами
источник