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