04/10/2023

2. COPY et tables temporaires

Lu 344 fois Licence Creative Commons

Lecture d'un fichier CSV

Récupérez le fichier factures.csv associé à cette slide et enregistrez-le au même endroit que votre docker-compose.yml ou à l'emplacement de votre choix si vous n'utilisez pas le setup Docker.
Il contient une ligne d'en-têtes et 4 lignes de factures avec la description, le prix HT et la date d'émission. L'objectif sera ici d'enregistrer les données du fichier dans la table facture.

Un problème se pose toutefois: le fichier ne contient pas d'identifiant et la commande à utiliser ne nous permettra pas d'utiliser la séquence lors de l'insertion.
Pour contourner le problème, on utilisera une table temporaire: une table qui sera automatiquement supprimée à la fin de la session.

CREATE TEMPORARY TABLE tmp_facture_csv (
    description VARCHAR(255) NOT NULL,
    prix_ht INT NOT NULL,
    date_emission DATE NOT NULL
);

On peut ensuite copier les données du fichier vers la table temporaire en précisant diverses informations sur le format:

COPY tmp_facture_csv(description, prix_ht, date_emission)
FROM '/var/cours/factures.csv'
DELIMITER ','
HEADER;

Note: adaptez le chemin vers le fichier si vous n'utilisez pas le setup Docker.

Il nous reste plus qu'à copier une seconde fois les données depuis la table temporaire vers la table facture:

INSERT INTO facture (id, description, prix_ht, date_emission)
SELECT nextval('seq_facture_id')
    , description
    , prix_ht
    , date_emission
FROM tmp_facture_csv;

On peut éventuellement supprimer la table temporaire:

DROP TABLE tmp_facture_csv;

Export d'un fichier CSV

On peut aussi effectuer l'opération inverse: copier les données d'une table vers un fichier CSV.
Mais un nouveau problème se pose: COPY ne permet pas l'utilisation de colonnes générées.

Nous allons de nouveau contourner ce problème avec une table temporaire:

CREATE TEMPORARY TABLE tmp_export_facture (
    id INT NOT NULL,
    description VARCHAR(255) NOT NULL,
    prix_ht INT NOT NULL,
    tva INT NOT NULL,
    prix_ttc INT NOT NULL,
    date_emission DATE NOT NULL,
    date_echeance DATE NOT NULL
);

On y copie ensuite les données de la table facture, dont les colonnes générées:

INSERT INTO tmp_export_facture (id, description, prix_ht, tva, prix_ttc, date_emission, date_echeance)
SELECT id, description, prix_ht, tva, prix_ttc, date_emission, date_echeance
FROM facture
ORDER BY date_emission ASC;

On peut enfin tout exporter vers un fichier:

COPY tmp_export_facture (id, description, prix_ht, tva, prix_ttc, date_emission, date_echeance)
TO '/var/cours/export-factures.csv'
DELIMITER ','
HEADER;

Note: en cas de problème de permission, n'hésitez pas à rajouter les droits d'écriture sur le dossier concerné via chmod ugo+w .

Et on termine par la suppression (facultative) de la table temporaire:

DROP TABLE tmp_export_facture;