IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Exporter les données dans le bon ordre


Sujet :

PostgreSQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Par défaut Exporter les données dans le bon ordre
    Bonjour,

    Je souhaiterai faire un backup de ma BDD (juste les data) en mettant les tables dans le bon ordre.
    Je m'explique : si je fais un export avec phppgadmin (ou avec pg_dmp.exe), puis que je vide ma base, et importe le fichier créé lors de mes manips d'export, j'ai des erreurs de "violates foreign key constraint".

    Je voudrais donc exporter automatiquement les tables dans "le bon ordre" en respectant les contraintes.

    J'ose imaginer qu'il y a une solution, car modifier les .sql à la main c'est long ... mais surtout je ne sais pas quels mots clés rechercher en gros...

    Voilà merci si quelqu'un peut m'éclairer.

    a+

  2. #2
    Membre éprouvé Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 874
    Par défaut
    En principe, en utilisant pg_dump ou pg_restore, tu ne devrais pas avoir de problème particulier. Tu peux toujours jouer avec les différentes options...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Par défaut
    Citation Envoyé par kain_tn Voir le message
    En principe, en utilisant pg_dump ou pg_restore, tu ne devrais pas avoir de problème particulier. Tu peux toujours jouer avec les différentes options...
    Justement pg_dump exporte les tables par ordre alphabétique.
    Si la table "A" possède des clés étrangères situées dans la table "B", j'ai des erreurs.
    Je vais voir du côté de pg_restore.
    (Avant je restaurai via phppgadmin ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "[...]psql.exe" -e -U myuser -d mybase -f data.sql
    )

    EDIT :
    Après avoir essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "%PG_DIR%pg_dump.exe" -U myuser -Ft mybase > base.tar
     
    "%PG_DIR%pg_restore.exe" -U myuser -d mybase base.tar
    Toujours la même chose.

    En regardant les options je ne trouve pas mon bonheur. Il doit y avoir une notion que je n'ai pas comprise ou complètement manquée !?
    Ma façon de gérer les clé étrangère n'est peut-être pas bonne ?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    L'option -L de pg_restore permet de spécifier un ordre alternatif.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Par défaut
    Citation Envoyé par estofilo Voir le message
    L'option -L de pg_restore permet de spécifier un ordre alternatif.
    Merci. Je pourrai creuser cette piste, mais n'est-il pas possible d'ordonnancer lors du dump plutôt que lors du restore ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Je pense que pg_dump adopte un algorithme différent suivant qu'on spécifie l'option -a (--data-only) ou pas.
    Au début de la discussion tu dis que tu veux sauvegarder uniquement les données (donc sous-entendu par les définitions des tables et les contraintes d'intégrité associées) donc j'imaginerais que c'est avec l'option -a.
    Mais plus loin la commande pg_dump que tu cites n'a pas cette option.
    Peux-tu préciser ça de manière explicite? -a ou pas -a ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Je pense que pg_dump adopte un algorithme différent suivant qu'on spécifie l'option -a (--data-only) ou pas.
    Au début de la discussion tu dis que tu veux sauvegarder uniquement les données (donc sous-entendu par les définitions des tables et les contraintes d'intégrité associées) donc j'imaginerais que c'est avec l'option -a.
    Mais plus loin la commande pg_dump que tu cites n'a pas cette option.
    Peux-tu préciser ça de manière explicite? -a ou pas -a ?
    Au temps pour moi, à trop vouloir éclaircir mon code, j'en ai trop enlevé... Voici mon dump complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @echo off
    set PG_DIR=C:\Program Files\PostgreSQL\8.3\bin\
    set NEWDATE=%DATE:~0,2%-%DATE:~3,2%-%DATE:~6,4%_%TIME:~-11,-9%-%TIME:~-8,-6%-%TIME:~-5,-3%
     
    "%PG_DIR%pg_dump.exe" --data-only --inserts --file=data-%NEWDATE%.sql --format=p --username=myuser mybase
     
    pause
    --data-only = -a, pour n'avoir que les données (je garde la structure via une autre fonction)
    --inserts, pour avoir les sauvegarde en mode SQL et non pas COPY, si je ne dis pas de bêtises.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    OK ça explique que l'import des données ne passe pas directement, les contraintes d'intégrité n'étant pas du tout considérées par l'export dans ce contexte.
    Pour ma part je pense qu'il n'y a pas de solution au niveau de l'export, sauf à le faire table par table avec l'option -t, mais ça parait plutôt moins pratique que d'agir à la restauration avec l'option -l

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Par défaut
    Citation Envoyé par estofilo Voir le message
    OK ça explique que l'import des données ne passe pas directement, les contraintes d'intégrité n'étant pas du tout considérées par l'export dans ce contexte.
    Pour ma part je pense qu'il n'y a pas de solution au niveau de l'export, sauf à le faire table par table avec l'option -t, mais ça parait plutôt moins pratique que d'agir à la restauration avec l'option -l
    Oui en fait j'ai fait en 2 temps en concaténant les dump...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set TABLE1=--table=A --table=Z
    set TABLE2=--table=QuiDependDeA--table=QuiDependDeZ
    "%PG_DIR%pg_dump.exe" --data-only --inserts %TABLE1% --format=p --username=myuser mybase  > %CURRENT_DIR%data-%NEWDATE%.sql
    "%PG_DIR%pg_dump.exe" --data-only --inserts %TABLE2% --format=p --username=myuser mybase >> %CURRENT_DIR%data-%NEWDATE%.sql

  10. #10
    Membre éprouvé Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 874
    Par défaut
    Petite question au passage: pourquoi tu ne veux pas utiliser le mode COPY plutôt que INSERT? C'est bien plus rapide pour ré-injecter les données (sans comparaison avec le mode INSERT en termes de performances sur une grosse base)

    La seule contrainte imposée dans ce cas est qu'il te faudrait faire ta restauration de base en ligne de commande et non sous phppgadmin.

    Il est possible (de mémoire) que tu ne rencontre pas ton problème de clés étrangères avec le mode COPY

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 007
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 007
    Billets dans le blog
    6
    Par défaut
    Le plus simple est de faire un script qui enlève les contraintes FK avant insertion et les remet après.
    C'est assez facile à faire avec les vues normalisées d'information de schéma.
    Inspirez vous de ce que j'ai fait pour SQL Server :
    http://blog.developpez.com/sqlpro/p6...ts-sql-server/
    En particulier des points 2 et 6

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Par défaut
    Merci à vous deux.

    En fait mon but était d'avoir un moyen simple de sauver une petite base. Et de pouvoir éventuellement ré-injecter les données via phppgadmin (voilà pourquoi INSERT plutôt que COPY).

    Ma solution, bien qu'un peu moche, me suffit au final. Et je n'ai pas le temps de me consacrer à une autre solution pour l'instant...

    Je mets le sujet en "résolu" ?

Discussions similaires

  1. [MySQL] Récupération de données dans le bon ordre
    Par Lotus355 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 27/12/2013, 14h01
  2. [1.x] comment exporter les données dans un fichier excell
    Par farhaenis dans le forum Symfony
    Réponses: 2
    Dernier message: 29/07/2011, 18h12
  3. [Débutant] exporter les donneés dans un fichier excel
    Par gueloude dans le forum MATLAB
    Réponses: 1
    Dernier message: 05/01/2011, 11h26
  4. Exporter les données dans un fichier excel
    Par merlinerick dans le forum C
    Réponses: 4
    Dernier message: 13/08/2008, 22h52
  5. Trier les données dans 1 tableau par ordre décroissant
    Par Blunet dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 23/11/2005, 09h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo