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

Python Discussion :

chargement d'une table postgresql


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 491
    Par défaut chargement d'une table postgresql
    Bonjour,

    j'essaie de charger une table d'une base de données PosgreSQL/PostGIS via python à partir d'un fichier csv et l'instruction copy_from

    Un extrait de mon fichier csv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0106000020721500000100000001030000000100000005000000666666666F17244100000080CB703B41666666666517244100000080CB703B41666666666517244100000080C6703B41666666666F17244100000080C6703B41666666666F17244100000080CB703B41,AERODROM0000002203176519,Internationale,Héliport,Civil,\N,\N,1,En service,2019/06/20 20:17:43.552,\N,\N,\N,\N,\N,Orthophotographie,3.0,\N,\N,\N
    Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    f = open('monfichier.csv', 'r')
    with maconnection.cursor() as cur:
        cur.copy_from(f, 'aerodrome', sep=',', columns=('geometrie', 'cleabs', 'categorie', 'nature', 'usage', 'toponyme', 'statut_du_toponyme', 'fictif','etat_de_l_objet', 'date_creation', 'date_modification', 'date_d_apparition', 'date_de_confirmation','sources', 'identifiants_sources', 'methode_d_acquisition_planimetrique', 'precision_planimetrique','altitude', 'code_icao', 'code_iata'))
     
    maconnection.commit()
    f.close()
    Ca ne renvoie pas d'erreur, mais ça ne charge pas les données, la table est vide au final.

    Pourquoi?

    Merci,
    Nico

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par DiverSIG Voir le message
    Pourquoi?


    Soit ça vient de Python, soit ça vient de Postgres. Déjà la base serait de vérifier si un copy sql fonctionne. Cela permettrait déjà de cibler.
    Et puis peut-être une description de ta table nous aiderait aussi. Par exemple je suis curieux de voir comment est défini ce champ "geometrie" qui peut stocker une data "0106000020721500000100000001030000000100000005000000666666666F17244100000080CB703B41666666666517244100000080CB703B41666666666517244100000080C6703B41666666666F17244100000080C6703B41666666666F17244100000080CB703B41"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 491
    Par défaut
    j'ai l'extension PostGIS.

    voici le script de création de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    SET client_encoding = 'utf-8';
    SET standard_conforming_strings = OFF;
    DROP TABLE IF EXISTS "aerodrome" CASCADE;
    BEGIN;
    CREATE TABLE "aerodrome"();
    SELECT AddGeometryColumn('aerodrome','geometrie',5490,'MULTIPOLYGON',2);
    CREATE INDEX "aerodrome_geometrie_geom_idx" ON "aerodrome" USING GIST ("geometrie");
    ALTER TABLE "aerodrome" ADD COLUMN "cleabs" VARCHAR(24);
    ALTER TABLE "aerodrome" ADD COLUMN "categorie" VARCHAR;
    ALTER TABLE "aerodrome" ADD COLUMN "nature" VARCHAR;
    ALTER TABLE "aerodrome" ADD COLUMN "usage" VARCHAR;
    ALTER TABLE "aerodrome" ADD COLUMN "toponyme" VARCHAR;
    ALTER TABLE "aerodrome" ADD COLUMN "statut_du_toponyme" VARCHAR;
    ALTER TABLE "aerodrome" ADD COLUMN "fictif" BOOLEAN;
    ALTER TABLE "aerodrome" ADD COLUMN "etat_de_l_objet" VARCHAR;
    ALTER TABLE "aerodrome" ADD COLUMN "date_creation" timestamp with time zone;
    ALTER TABLE "aerodrome" ADD COLUMN "date_modification" timestamp with time zone;
    ALTER TABLE "aerodrome" ADD COLUMN "date_d_apparition" date;
    ALTER TABLE "aerodrome" ADD COLUMN "date_de_confirmation" date;
    ALTER TABLE "aerodrome" ADD COLUMN "sources" VARCHAR;
    ALTER TABLE "aerodrome" ADD COLUMN "identifiants_sources" VARCHAR;
    ALTER TABLE "aerodrome" ADD COLUMN "methode_d_acquisition_planimetrique" VARCHAR;
    ALTER TABLE "aerodrome" ADD COLUMN "precision_planimetrique" NUMERIC(5,1);
    ALTER TABLE "aerodrome" ADD COLUMN "altitude" NUMERIC(7,2);
    ALTER TABLE "aerodrome" ADD COLUMN "code_icao" VARCHAR(4);
    ALTER TABLE "aerodrome" ADD COLUMN "code_iata" VARCHAR(3);
    COMMIT;
    pour le COPY, j'ai pgAdmin 4 version 5.1, et la commande COPY ne fonctionne pas sur cette version apparement (il faut la version 8 si j'ai bien vu)

    Nico

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par DiverSIG Voir le message
    pour le COPY, j'ai pgAdmin 4 version 5.1, et la commande COPY ne fonctionne pas sur cette version apparement (il faut la version 8 si j'ai bien vu)
    Il y a un forum postgres pour répondre à ces questions (il y a pgloader, pg_bulkload,...). L'idée étant d'utiliser les outils qui ont été fabriqués pour avant de partir à coder...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par DiverSIG Voir le message
    voici le script de création de la table :
    En enlevant la colonne "geometrie" (je n'ai pas mis l'extension postgis et je n'ai pas envie de la télécharger) et bien entendu en adaptant alors ton CSV (supprimer la première colonne) j'obtiens (sous Postgres) cette erreur
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERROR:  invalid input syntax for type timestamp with time zone: "\N"
    CONTEXT:  COPY aerodrome, line 1, column date_modification: "\N"

    Voici le contenu du fichier: AERODROM0000002203176519,Internationale,Héliport,Civil,\N,\N,1,En service,2019/06/20 20:17:43.552,\N,\N,\N,\N,\N,Orthophotographie,3.0,\N,\N,\N.

    Et la commande sql: copy aerodrome from '...(nom du fichier CSV)...' with delimiter ',' csv.

    J'ai aussi tenté via les noms des colonnes...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    copy aerodrome (
    	"cleabs",
    	"categorie",
    	"nature",
    	"usage",
    	"toponyme",
    	"statut_du_toponyme",
    	"fictif","etat_de_l_objet",
    	"date_creation",
    	"date_modification",
    	"date_d_apparition",
    	"date_de_confirmation",
    	"sources",
    	"identifiants_sources",
    	"methode_d_acquisition_planimetrique",
    	"precision_planimetrique","altitude",
    	"code_icao",
    	"code_iata"
    ) from '...(nom du fichier CSV)...' with delimiter ',' csv
    ...même erreur.

    Citation Envoyé par DiverSIG Voir le message
    Ca ne renvoie pas d'erreur
    Oui donc les erreurs ont été absorbées par le curseur. Peut-être ouvrir la doc de ta lib Python<=>Postgres (psycopg2 ?) pour voir ce qui se dit quand un curseur arrive sur une erreur. Et tu ferais bien aussi de checker l'encoding du fichier d'entrée (ce "Héliport" significatif d'un encodage utf-8 lu en ascii)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par DiverSIG Voir le message
    Pourquoi?
    Avec postgres vient un client psql (ou un client pgadmin) qui est optimisé pour faire çà en ligne de commande. (qu'on pourra toujours lancer depuis python si nécessaire). Après réinventer la roue, c'est plus difficile mais quel intérêt?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Chargement d'une table de faits
    Par JoeLF dans le forum Oracle
    Réponses: 3
    Dernier message: 22/10/2007, 11h26
  2. connexion a une table postgreSQL ?
    Par aquafafa dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 27/08/2007, 12h50
  3. Chargement d'une table avec de très nombreux champs
    Par Davou dans le forum Débuter
    Réponses: 4
    Dernier message: 04/07/2007, 15h59
  4. nologging pour chargement d'une table temporaire
    Par psafp dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/06/2007, 09h16
  5. Réponses: 7
    Dernier message: 24/08/2006, 08h28

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