Подтвердить что ты не робот

Экспорт базы данных в CSV файл

Я хочу экспортировать базу данных в файл CSV. Возможно ли это?

Если это возможно, то как это сделать, используя PostgreSQL? Я видел, что мы можем преобразовать определенную таблицу в файл CSV, но я не знаю всей базы данных.

4b9b3361

Ответ 1

Вы можете использовать это в консоли psql:

\copy (SELECT foo,bar FROM whatever) TO '/tmp/file.csv' DELIMITER ',' CSV HEADER

Или в консоли bash:

psql -P format=unaligned -P tuples_only -P fieldsep=\, -c "SELECT foo,bar FROM whatever" > output_file

Ответ 2

Я сделал эту функцию pl/pgsql для создания одного CSV файла в таблице (за исключением просмотров, благодаря @tarikki):

CREATE OR REPLACE FUNCTION db_to_csv(path TEXT) RETURNS void AS $$
declare
   tables RECORD;
   statement TEXT;
begin
FOR tables IN 
   SELECT (table_schema || '.' || table_name) AS schema_table
   FROM information_schema.tables t INNER JOIN information_schema.schemata s 
   ON s.schema_name = t.table_schema 
   WHERE t.table_schema NOT IN ('pg_catalog', 'information_schema')
   AND t.table_type NOT IN ('VIEW')
   ORDER BY schema_table
LOOP
   statement := 'COPY ' || tables.schema_table || ' TO ''' || path || '/' || tables.schema_table || '.csv' ||''' DELIMITER '';'' CSV HEADER';
   EXECUTE statement;
END LOOP;
return;  
end;
$$ LANGUAGE plpgsql;

И я использую его так:

SELECT db_to_csv('/home/user/dir');
-- this will create one csv file per table, in /home/user/dir/

Ответ 3

Модифицированный ответ jlldoras блестящий, добавив одну строку, чтобы предотвратить попытку script копировать виды:

CREATE OR REPLACE FUNCTION db_to_csv(path TEXT) RETURNS void AS $$
declare
   tables RECORD;
   statement TEXT;
begin
FOR tables IN 
   SELECT (table_schema || '.' || table_name) AS schema_table
   FROM information_schema.tables t INNER JOIN information_schema.schemata s 
   ON s.schema_name = t.table_schema 
   WHERE t.table_schema NOT IN ('pg_catalog', 'information_schema', 'configuration')
   AND t.table_type NOT IN ('VIEW')
   ORDER BY schema_table
LOOP
   statement := 'COPY ' || tables.schema_table || ' TO ''' || path || '/' || tables.schema_table || '.csv' ||''' DELIMITER '';'' CSV HEADER';
   EXECUTE statement;
END LOOP;
return;  
end;
$$ LANGUAGE plpgsql;

Ответ 4

COPY tablename TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;

проверьте это

Ответ 5

Вам нужен один большой CSV файл с данными из всех таблиц?

Наверное, нет. Вам нужны отдельные файлы для каждой таблицы или одного большого файла с дополнительной информацией, которая может быть выражена в заголовке файла CSV.

Отдельные файлы

Другие ответы показывают, как создавать отдельные файлы для каждой таблицы. Вы можете запросить базу данных, чтобы показать вам все таблицы с таким запросом:

SELECT DISTINCT table_name
FROM information_schema.columns
WHERE table_schema='public'
AND position('_' in table_name) <> 1
ORDER BY 1

Один большой файл

Один большой файл со всеми таблицами в формате CSV, используемый командой PostgreSQL COPY, может быть создан с помощью команды pg_dump. Вывод также будет иметь все CREATE TABLE, CREATE FUNCTION и т.д., Но с Python, Perl или подобным языком вы можете легко извлекать только CSV-данные.

Ответ 6

Если вы хотите указать базу данных и пользователя при экспорте, вы можете просто изменить ответ, указанный Piotr, следующим образом

psql -P format=unaligned -P tuples_only -P fieldsep=\, -c "select * from tableName" > tableName_exp.csv -U <USER> -d <DB_NAME>