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 :

Commande Copy de postgres


Sujet :

PostgreSQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 20
    Par défaut Commande Copy de postgres
    Bonjour,

    j'ai ce prog.
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    void publishfilename (int srcid, const char *targetid, const char *fileid)
    {
    	PGresult* resultkw;
     
    	char kw[128];
     
    	sprintf(kw, "copy publishs (fileid, targetid, srcid | (select mape_publish(date_trunc('minute',current_timestamp), %d, '%s', '%s'))) to '/root/hamack/DataBase/keywd.csv' STDOUT with csv;",srcid, fileid, targetid);
    	resultkw = PQexec(connect_database, kw);
    	if ((PQresultStatus(resultkw) != PGRES_TUPLES_OK))
    	{
    	fprintf(stderr, "couldn't execute query keyword_files\n" );
    	printf("error: %s\n",PQresultErrorMessage(resultkw));
    	}
    	else {
    	char *key1;
    	key1 = PQgetvalue(resultkw,0,0);
    	printf ("%s \n", key1);
    	printf ("commande keyword_files exécutée\n" );
    	}
    	PQclear(resultkw);
     
    	sprintf(kw, "copy keyword_files (srcid, fileid, targetid) from '/root/hamack/DataBase/keywd.csv' STDIN with csv;");
    	resultkw = PQexec(connect_database, kw);
    	if ((PQresultStatus(resultkw) != PGRES_TUPLES_OK))
    	{
    	fprintf(stderr, "couldn't execute query keyword_files\n" );
    	printf("error: %s\n",PQresultErrorMessage(resultkw));
    	}
    	else {
    	char *key1;
    	key1 = PQgetvalue(resultkw,0,0);
    	printf ("%s \n", key1);
    	printf ("commande keyword_files exécutée\n" );
    	}
    	PQclear(resultkw);
    }
    et ça me rend le message d'erreur:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    couldn't execute query keyword_files
    error: ERREUR:  erreur de syntaxe sur ou près de « | »
    LINE 1: copy publishs (fileid, targetid, srcid | (select mape_publis...
                                                   ^
     
    couldn't execute query keyword_files
    error: ERREUR:  erreur de syntaxe sur ou près de « STDIN »
    LINE 1: ... targetid) from '/root/hamack/DataBase/keywd.csv' STDIN with...
                                                                 ^
     
    *** stack smashing detected ***: ./Loggerme.out terminated
    ======= Backtrace: =========
    /lib/i686/nosegneg/libc.so.6(__fortify_fail+0x48)[0xb7dc3a88]
    /lib/i686/nosegneg/libc.so.6(__fortify_fail+0x0)[0xb7dc3a40]
    ./Loggerme.out[0x804947a]
    [0x74202929]
    ======= Memory map: ========
    08048000-0804b000 r-xp 00000000 08:02 131081     /root/hamack/DataBase/Loggerme.out
    0804b000-0804c000 r--p 00002000 08:02 131081     /root/hamack/DataBase/Loggerme.out
    0804c000-0804d000 rw-p 00003000 08:02 131081     /root/hamack/DataBase/Loggerme.out
    0804d000-08120000 rw-p 0804d000 00:00 0          [heap]
    b77da000-b77e4000 r-xp 00000000 08:02 802847     /lib/i686/nosegneg/libnss_files-2.9.so
    b77e4000-b77e5000 r--p 00009000 08:02 802847     /lib/i686/nosegneg/libnss_files-2.9.so
    b77e5000-b77e6000 rw-p 0000a000 08:02 802847     /lib/i686/nosegneg/libnss_files-2.9.so
    b77e6000-b77ef000 r-xp 00000000 08:02 802853     /lib/i686/nosegneg/libnss_nis-2.9.so
    b77ef000-b77f0000 r--p 00008000 08:02 802853     /lib/i686/nosegneg/libnss_nis-2.9.so
    b77f0000-b77f1000 rw-p 00009000 08:02 802853     /lib/i686/nosegneg/libnss_nis-2.9.so
    b77f1000-b7806000 r-xp 00000000 08:02 802849     /lib/i686/nosegneg/libnsl-2.9.so
    b7806000-b7807000 r--p 00014000 08:02 802849     /lib/i686/nosegneg/libnsl-2.9.so
    b7807000-b7808000 rw-p 00015000 08:02 802849     /lib/i686/nosegneg/libnsl-2.9.so
    b7808000-b780a000 rw-p b7808000 00:00 0 
    b780a000-b7811000 r-xp 00000000 08:02 802843     /lib/i686/nosegneg/libnss_compat-2.9.so
    b7811000-b7812000 r--p 00006000 08:02 802843     /lib/i686/nosegneg/libnss_compat-2.9.so
    b7812000-b7813000 rw-p 00007000 08:02 802843     /lib/i686/nosegneg/libnss_compat-2.9.so
    b781b000-b781d000 rw-p b781b000 00:00 0 
    b781d000-b7820000 r-xp 00000000 08:02 412150     /usr/lib/libgpg-error.so.0.4.0
    b7820000-b7821000 rw-p 00002000 08:02 412150     /usr/lib/libgpg-error.so.0.4.0
    b7821000-b7892000 r-xp 00000000 08:02 412583     /usr/lib/libgcrypt.so.11.5.3
    b7892000-b7895000 rw-p 00070000 08:02 412583     /usr/lib/libgcrypt.so.11.5.3
    b7895000-b7896000 rw-p b7895000 00:00 0 
    b7896000-b78a5000 r-xp 00000000 08:02 416685     /usr/lib/libtasn1.so.3.1.6
    b78a5000-b78a6000 rw-p 0000e000 08:02 416685     /usr/lib/libtasn1.so.3.1.6
    b78a6000-b7939000 r-xp 00000000 08:02 712707     /usr/lib/libgnutls.so.26.14.10
    b7939000-b793d000 rw-p 00093000 08:02 712707     /usr/lib/libgnutls.so.26.14.10
    b793d000-b7953000 r-xp 00000000 08:02 412493     /usr/lib/libsasl2.so.2.0.22
    b7953000-b7954000 rw-p 00015000 08:02 412493     /usr/lib/libsasl2.so.2.0.22
    b7954000-b7960000 r-xp 00000000 08:02 414404     /usr/lib/liblber-2.4.so.2.1.0
    b7960000-b7961000 rw-p 0000c000 08:02 414404     /usr/lib/liblber-2.4.so.2.1.0
    b7961000-b7973000 r-xp 00000000 08:02 802831     /lib/i686/nosegneg/libresolv-2.9.so
    b7973000-b7974000 r--p 00011000 08:02 802831     /lib/i686/nosegneg/libresolv-2.9.so
    b7974000-b7975000 rw-p 00012000 08:02 802831     /lib/i686/nosegneg/libresolv-2.9.so
    b7975000-b7978000 rw-p b7975000 00:00 0 
    b7978000-b797a000 r-xp 00000000 08:02 803156     /lib/libkeyutils-1.2.so
    b797a000-b797b000 rw-p 00001000 08:02 803156     /lib/libkeyutils-1.2.so
    b797b000-b7981000 r-xp 00000000 08:02 412390     /usr/lib/libkrb5support.so.0.1
    b7981000-b7982000 rw-p 00005000 08:02 412390     /usr/lib/libkrb5support.so.0.1
    b7982000-b79a4000 r-xp 00000000 08:02 412386     /usr/lib/libk5crypto.so.3.1
    b79a4000-b79a5000 rw-p 00022000 08:02 412386     /usr/lib/libk5crypto.so.3.1
    b79a5000-b79b9000 r-xp 00000000 08:02 417467     /usr/lib/libz.so.1.2.3.3
    b79b9000-b79ba000 rw-p 00013000 08:02 417467     /usr/lib/libz.so.1.2.3.3
    b79ba000-b79cf000 r-xp 00000000 08:02 802855     /lib/i686/nosegneg/libpthread-2.9.so
    b79cf000-b79d0000 r--p 00014000 08:02 802855     /lib/i686/nosegneg/libpthread-2.9.so
    b79d0000-b79d1000 rw-p 00015000 08:02 802855     /lib/i686/nosegneg/libpthread-2.9.so
    b79d1000-b79d4000 rw-p b79d1000 00:00 0 
    b79d4000-b7a14000 r-xp 00000000 08:02 414405     /usr/lib/libldap_r-2.4.so.2.1.0
    b7a14000-b7a16000 rw-p 0003f000 08:02 414405     /usr/lib/libldap_r-2.4.so.2.1.0
    b7a16000-b7a17000 rw-p b7a16000 00:00 0 
    b7a17000-b7a20000 r-xp 00000000 08:02 802856     /lib/i686/nosegneg/libcrypt-2.9.so
    b7a20000-b7a21000 r--p 00008000 08:02 802856     /lib/i686/nosegneg/libcrypt-2.9.so
    b7a21000-b7a22000 rw-p 00009000 08:02 802856     /lib/i686/nosegneg/libcrypt-2.9.so
    b7a22000-b7a49000 rw-p b7a22000 00:00 0 
    b7a49000-b7a77000 r-xp 00000000 08:02 412401     /usr/lib/libgssapi_krb5.so.2.2
    b7a77000-b7a78000 rw-p 0002d000 08:02 412401     /usr/lib/libgssapi_krb5.so.2.2
    b7a78000-b7a7a000 r-xp 00000000 08:02 802877     /lib/libcom_err.so.2.1
    b7a7a000-b7a7b000 rw-p 00001000 08:02 802877     /lib/libcom_err.so.2.1
    b7a7b000-b7b27000 r-xp 00000000 08:02 412394     /usr/lib/libkrb5.so.3.3
    b7b27000-b7b2d000 rw-p 000ac000 08:02 412394     /usr/lib/libkrb5.so.3.3
    b7b2d000-b7c67000 r-xp 00000000 08:02 426897     /usr/lib/i686/cmov/libcrypto.so.0.9.8
    b7c67000-b7c7d000 rw-p 0013a000 08:02 426897     /usr/lib/i686/cmov/libcrypto.so.0.9.8
    b7c7d000-b7c81000 rw-p b7c7d000 00:00 0 
    b7c81000-b7cc3000 r-xp 00000000 08:02 426898     /usr/lib/i686/cmov/libssl.so.0.9.8
    b7cc3000-b7cc7000 rw-p 00042000 08:02 426898     /usr/lib/i686/cmov/libssl.so.0.9.8
    b7cc7000-b7e23000 r-xp 00000000 08:02 802832     /lib/i686/nosegneg/libc-2.9.so
    b7e23000-b7e24000 ---p 0015c000 08:02 802832     /lib/i686/nosegneg/libc-2.9.so
    b7e24000-b7e26000 r--p 0015c000 08:02 802832     /lib/i686/nosegneg/libc-2.9.so
    b7e26000-b7e27000 rw-p 0015e000 08:02 802832     /lib/i686/nosegneg/libc-2.9.so
    b7e27000-b7e2a000 rw-p b7e27000 00:00 0 
    b7e2a000-b7e54000 r-xp 00000000 08:02 803074     /lib/libgcc_s.so.1
    b7e54000-b7e55000 rw-p 00029000 08:02 803074     /lib/libgcc_s.so.1
    b7e55000-b7e79000 r-xp 00000000 08:02 802841     /lib/i686/nosegneg/libm-2.9.so
    b7e79000-b7e7a000 r--p 00023000 08:02 802841     /lib/i686/nosegneg/libm-2.9.so
    b7e7a000-b7e7b000 rw-p 00024000 08:02 802841     /lib/i686/nosegneg/libm-2.9.so
    b7e7b000-b7f5f000 r-xp 00000000 08:02 410784     /usr/lib/libstdc++.so.6.0.12
    b7f5f000-b7f63000 r--p 000e4000 08:02 410784     /usr/lib/libstdc++.so.6.0.12
    b7f63000-b7f64000 rw-p 000e8000 08:02 410784     /usr/lib/libstdc++.so.6.0.12
    b7f64000-b7f6c000 rw-p b7f64000 00:00 0 
    b7f6c000-b7f6e000 r-xp 00000000 08:02 802857     /lib/i686/nosegneg/libdl-2.9.so
    b7f6e000-b7f6f000 r--p 00001000 08:02 802857     /lib/i686/nosegneg/libdl-2.9.so
    b7f6f000-b7f70000 rw-p 00002000 08:02 802857     /lib/i686/nosegneg/libdl-2.9.so
    b7f70000-b7f8e000 r-xp 00000000 08:02 414410     /usr/lib/libpq.so.5.1
    b7f8e000-b7f8f000 rw-p 0001e000 08:02 414410     /usr/lib/libpq.so.5.1
    b7f96000-b7f99000 rw-p b7f96000 00:00 0 
    b7f99000-b7f9a000 r-xp b7f99000 00:00 0          [vdso]
    b7f9a000-b7fb6000 r-xp 00000000 08:02 803058     /lib/ld-2.9.so
    b7fb6000-b7fb7000 r--p 0001b000 08:02 803058     /lib/ld-2.9.so
    b7fb7000-b7fb8000 rw-p 0001c000 08:02 803058     /lib/ld-2.9.so
    bfe8e000-bfea3000 rw-p bfe8e000 00:00 0          [stack]
    Abandon
    je ne sais pas c koi le pb, c la première fois que j'utilise "copy"

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 861
    Par défaut
    Bonjour,

    Je suppose qu'il ne veut pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "copy publishs (fileid, targetid, srcid | (select mape_publish(date_trunc('minute',current_timestamp), %d, '%s', '%s')))
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "copy publishs (fileid, targetid, srcid || (select mape_publish(date_trunc('minute',current_timestamp), %d, '%s', '%s')))
    , '||' étant l'opérateur de concaténation.
    Un peu d'informations sur la structure de la table 'publish' et sur la fonction mape_publish serait les bienvenues pour en être sûr.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 20
    Par défaut
    publishs est une table qui récupère les paramètres de publications via la relation mape_publish.
    par contre si j'élimine le select, et je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf(kw, "copy publishs (srcid, targetid, fileid) to '/home/keywd.csv';");
    malgé que j'ai changé l'utilisateur de ce fichier, et je lui ai donné tous les droits, un message d'ereur me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    couldn't execute query keyword_files
    error: ERREUR:  doit être super-utilisateur pour utiliser COPY à partir ou vers un fichier
    HINT:  Tout le monde peut utiliser COPY vers stdout ou à partir de stdin.
    La commande \copy de psql fonctionne aussi pour tout le monde.
    alors que j'ai besoin de copier les données dans un fichier externe non pas en local!

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 861
    Par défaut
    Pour écrire dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '/root/hamack/DataBase/keywd.csv'
    , tu dois en effet être super-utilisateur puisque /root/ est le répertoire 'home' pour le compte super-utilisateur sous linux.

    Après, si tu veux juste écrire dans un flux, tu peux enlever le nom de fichier et le rediriger depuis le shell par exemple.

    La syntaxe de copy.

  5. #5
    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
    Ce message d'erreur:
    error: ERREUR: doit être super-utilisateur pour utiliser COPY à partir ou vers un fichier
    HINT: Tout le monde peut utiliser COPY vers stdout ou à partir de stdin.
    fait référence au fait d'être super-utilisateur de la base de données. Les droits sur le système de fichier sont un autre problème qui donnerait lieu à un autre message d'erreur s'il survenait.

    Dans le cas général, le client et le serveur sont sur une machine différente, et on veut transférer un fichier du client vers une table du serveur ou l'inverse. Dans ce cas on ne peut pas utiliser la commande SQL COPY, dans un programme C il faut utiliser les fonctions PQgetCopyData() ou PQputCopyData() et gérer soi-même les lectures/écritures dans le fichier.

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 058
    Par défaut
    Dans le cas du client/serveur, pour insérer le contenu d'un fichier sur la machine cliente sans être super-utilisateur, on peut également lancer un client psql sur le poste et utiliser la commande \copy, avec les mêmes options que COPY, et avec un chemin pointant sur un fichier en local.

    Très pratique !

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 20
    Par défaut
    en fait, je veux l'exécuter depuis le code C, et non pas en lançant le client psql.
    je ne vois pas la solution clairement.

  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
    L'API à utiliser pour le faire en C est décrite ici: http://www.postgresql.org/docs/8.3/i...ibpq-copy.html

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 20
    Par défaut
    Si vous avez bien remarqué, j'essaye de faire la copie vers et depuis un fichier externe de la base, et non pas stdout et stdin.
    le lien que vous m'avez fourni s'intéresse au dernier cas.

  10. #10
    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
    Si vous avez bien remarqué, j'essaye de faire la copie vers et depuis un fichier externe de la base, et non pas stdout et stdin.
    le lien que vous m'avez fourni s'intéresse au dernier cas.
    Le problème est peut-être que la terminologie FROM STDIN et TO STDOUT adoptée par la commande COPY porte à confusion. En fait, 'FROM STDIN' veut dire que les données vont transiter en flux du client vers le serveur via la connexion BDD, par opposition à FROM 'nomfichier', dans lequel le serveur va ouvrir lui-même le fichier sur son système de fichiers et aucune donnée ne va transiter via la connexion. En fait FROM STDIN veut dire FROM CLIENT.

    Symétriquement, TO STDOUT veut dire que le serveur va envoyer le contenu de la table ou requête via la connexion BDD, par opposition à TO 'nomfichier' qui demande au serveur de créer un fichier sur son disque local et d'y écrire les données directement. TO STDOUT veut dire en fait TO CLIENT.

    L'usage de ces commandes n'a rien à voir avec le stdin et le stdout du processus client (le programme en C que tu écris) auquel le serveur n'a pas accès et avec lequel il ne peut rien faire.

    Quant aux fonctions de libpq évoquées dans le lien, elles travaillent sur des buffers mémoire. Que ces buffers soient alimentés par stdin ou par un fichier sur disque, ça ne les concerne pas, c'est le job de ton programme en C.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 20
    Par défaut
    très très clair, je vais essayer en espérant que ça marchera.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur avec la commande copy
    Par Bba_M dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 14/01/2008, 16h25
  2. Commande COPY FROM
    Par jan0 dans le forum Administration
    Réponses: 11
    Dernier message: 22/12/2006, 15h44
  3. Problème sur la commande COPY depuis un programme Java
    Par klereth dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 10/02/2006, 14h14
  4. correspondances commandes mysql et postgre
    Par jame_s dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 03/01/2005, 20h41
  5. la commande mysql_fetch_field pour postgre
    Par dim_italia dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 10/08/2004, 16h49

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