web-dev-qa-db-fra.com

Exporter la base de données dans un fichier CSV

Je veux exporter une base de données dans un fichier CSV. Est-ce possible?

Si c'est possible, comment puis-je faire cela avec PostgreSQL? J'ai vu que nous pouvons convertir une table particulière en fichier CSV mais je ne connais pas de base de données complète.

27
Anand Singh

J'ai créé cette fonction pl/pgsql pour créer un fichier .csv par table (sans vues, grâce à @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;

Et je l'utilise de cette façon:

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

Vous pouvez utiliser ceci sur la console psql:

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

Ou c'est dans la console bash:

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

Réponse brillante modifiée de jlldoras en ajoutant une ligne pour empêcher le script d’essayer de copier des vues:

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;
12
tarikki
COPY tablename TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;

regarde ça

6
Tombeau

Si vous souhaitez spécifier la base de données et l'utilisateur lors de l'exportation, vous pouvez simplement modifier la réponse donnée par Piotr comme suit

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

Voulez-vous un gros fichier CSV avec les données de toutes les tables?

Probablement pas. Vous voulez des fichiers séparés pour chaque table ou un gros fichier avec plus d'informations pouvant être exprimées dans l'en-tête du fichier CSV.

Fichiers séparés

Autres réponses montre comment créer des fichiers séparés pour chaque table. Vous pouvez interroger la base de données pour vous montrer toutes les tables avec une telle requête:

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

Un gros fichier

Un gros fichier avec toutes les tables au format CSV utilisé par PostgreSQL peut être créé avec la commande COPY avec la commande pg_dump. La sortie comportera également tous les codes CREATE TABLE, CREATE FUNCTION, etc., mais avec Python, Perl ou un langage similaire, vous pouvez facilement extraire uniquement des données CSV.

0
Michał Niklas

J'ai téléchargé une copie de RazorSQL , ouvert le serveur de base de données, cliqué avec le bouton droit de la souris sur la base de données et sélectionné Export Tables;.

0
Robs