2013-07-04 7 views
18

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

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

ответ

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

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

+3

Где вы получите 'products_273' от? Вы скопировали и вставили прямо из [этого ответа] (http://stackoverflow.com/a/1120390/704015), не так ли? Не круто. И стыдно тем, кто поддержал этот ответ. –

+1

Что случилось с копированием/вставкой из ответа на другой вопрос? Я не думаю, что это особенно хороший ответ, поскольку он применим только к одной таблице, а не к базе данных, но если вы не возражаете повторять эту технику, она будет работать. –

+0

@CarlG Вопрос для ссылок, вы не должны получать славу от чужой работы ...Вместо копирования/вставки вы могли бы просто добавить комментарий к вопросу и ссылку на ответ, который вы видели, сказав, что это может помочь (и тогда, возможно, отметьте вопрос как дублированный, даже если здесь ответ не подходит) – Random

34

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

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

Или в Баш консоли:

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

Это заслуживает большего внимания - простое, работающее решение! –

+4

Этого стоит меньше, так как он не отвечает на вопрос? – Eevee

0

Вы хотите, чтобы один большой файл 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-данные.

31

Я сделал это 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/ 
+1

Хотите этого точного решения, но не работая для меня, не могу открыть файл «/home/user/Documents/public.activities.csv» для записи: Permission denied –

+0

Похоже, что у пользователя нет разрешения писать на этом пути , Попробуйте другой путь, принадлежащий пользователю, выполняющему скрипт. – jllodra

+0

@ArihantGodha попробуйте изменить 'COPY' на' \ COPY' – dayer4b

0

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

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

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

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; 
Смежные вопросы