PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 05/11/2016 22:07:20

Deun
Membre

Valeur NULL pour timestamp

Bonsoir,

Bon j'ai fait un script sur mon linux préféré pour récupérer tous les fichiers sql d'un répertoire donné et les exécuter dans psql (c'est du supra simple avec find et ça marche très bien).
Ensuite, il faut mettre des valeurs dans les tables, et là j'ai les fichiers.txt qui vont bien.

sauf que voilà....

psql -d mabdd --command='\copy "schema"."ACOMPTE" from '~/Sauvegardes/Base/mabdd/ACOMPTE.txt' WITH (FORMAT csv, HEADER, NULL '\N',FORCE_NOT_NULL ("MODIFICATION_DATE","CREATION_DATE"))'

me retourne ceci...

ERROR:  invalid input syntax for type timestamp: "\N"
CONTEXTO:  COPY ACOMPTE, line 2, column MODIFICATION_DATE: "\N"

Faudrait-il que je transforme tous les "\N" qui correspondent aux colonnes de tous les fichiers.txt ? Si c'est ça je ne suis pas rendu, mais c'est faisable.

Sauf que j'imagine qu'il y a bien mieux à faire ?

Voilà la tête d'un fichier txt :

ID,ID_SALARIE,MONTANT,ID_MOUVEMENT,ARCHIVE,ORDRE,MODIFICATION_DATE,ID_USER_COMMON_MODIFY,ID_USER_COMMON_CREATE,CREATION_DATE
"1","1","0","1","0","0.00000000",\N,"1","1",\N

Et la table....

CREATE TABLE "ACOMPTE" (
"ID"  serial,
"ID_SALARIE" int DEFAULT 1 ,
"MONTANT" real DEFAULT 0 ,
"ID_MOUVEMENT" int DEFAULT 1 ,
"ARCHIVE" int DEFAULT 0 ,
"ORDRE" DECIMAL(16,8)  ,
"MODIFICATION_DATE" timestamp(6)  ,
"ID_USER_COMMON_MODIFY" int DEFAULT 1 ,
"ID_USER_COMMON_CREATE" int DEFAULT 1 ,
"CREATION_DATE" timestamp(6)  ,
PRIMARY KEY ("ID")) ;

Merci pour votre aide

Hors ligne

#2 05/11/2016 22:43:44

rjuju
Administrateur

Re : Valeur NULL pour timestamp

Vous demandez explicitement à ne pas avoir de correspondance avec la chaîne spécifiée comme « chaîne utilisée pour la représentation des NULL » pour les colonnes "MODIFICATION_DATE" et "CREATION_DATE" alors que celles-ci le sont dans votre fichier.  Concrètement, cela veut dire que pour ces deux colonnes, il ne faut pas considérer « \N » comme NULL mais littéralement « \n » ce qui n'est bien évidemment pas une timestamp valide.

Hors ligne

#3 06/11/2016 12:03:23

Deun
Membre

Re : Valeur NULL pour timestamp

Oui oui je comprend bien mais dans la première version que j'avais faite j'utilisais  FORCE_NULL qui est censé, si j'ai bien compris, trouver une concordance entre \N et une valeur qui aille pour le type timestamp mais j'ai la même erreur alors je ne sais pas trop comment tourner le problème.

Hors ligne

#4 06/11/2016 13:21:13

rjuju
Administrateur

Re : Valeur NULL pour timestamp

Ne rien préciser du tout devrait corriger votre problème, et insérer des NULL où il y a des \N :

psql -d mabdd --command='\copy "schema"."ACOMPTE" from '~/Sauvegardes/Base/mabdd/ACOMPTE.txt' WITH (FORMAT csv, HEADER, NULL '\N')'

Hors ligne

#5 06/11/2016 20:57:40

Deun
Membre

Re : Valeur NULL pour timestamp

Non ça ne marche pas après modif des \N en NULL

ERROR:  invalid input syntax for type timestamp: "NULL"
CONTEXTO:  COPY ACOMPTE, line 2, column MODIFICATION_DATE: "NULL"

Ps : la commande que j'ai lancé est psql -d mabdd --command='\copy "schema"."ACOMPTE" from '~/Sauvegardes/Base/mabdd/ACOMPTE.txt' WITH (FORMAT csv, HEADER, NULL '\N')'

Hors ligne

#6 06/11/2016 23:32:27

rjuju
Administrateur

Re : Valeur NULL pour timestamp

Je me suis mal exprimé. Je voulais dire de conserver le fichier source tel qu'il est et supprimer la clause FORCE_NOT_NULL afin que là où des \N sont présents dans le fichiers texte, des NULL soient insérés dans la table.

Hors ligne

#7 11/11/2016 16:39:42

Deun
Membre

Re : Valeur NULL pour timestamp

Non c'est moi qui me suis mal exprimé ... décidément :-)
J'avais bien compris et c'est ce que j'ai fait (d'où le Ps). Par contre j'avais compris de tenter aussi en transformant les \N en NULL.
Bref pour être clair j'ai tenté la commende sans la clause FORCE_NOT_NULL avec \N ou NULL mais dans les deux cas ça marche pas.... ce qui me fait susp0ecter que soucis est ailleurs.

Hors ligne

#8 11/11/2016 16:45:54

rjuju
Administrateur

Re : Valeur NULL pour timestamp

Je ne sais pas quoi vous dire. Avec vos données cela marche pour moi :

$ cat setup.sql
CREATE TABLE "ACOMPTE" (
    "ID"  serial,
    "ID_SALARIE" int DEFAULT 1 ,
    "MONTANT" real DEFAULT 0 ,
    "ID_MOUVEMENT" int DEFAULT 1 ,
    "ARCHIVE" int DEFAULT 0 ,
    "ORDRE" DECIMAL(16,8)  ,
    "MODIFICATION_DATE" timestamp(6)  ,
    "ID_USER_COMMON_MODIFY" int DEFAULT 1 ,
    "ID_USER_COMMON_CREATE" int DEFAULT 1 ,
    "CREATION_DATE" timestamp(6)  ,
    PRIMARY KEY ("ID")) ;

$ psql -f setup.sql

$ cat data.csv
ID,ID_SALARIE,MONTANT,ID_MOUVEMENT,ARCHIVE,ORDRE,MODIFICATION_DATE,ID_USER_COMMON_MODIFY,ID_USER_COMMON_CREATE,CREATION_DATE
"1","1","0","1","0","0.00000000",\N,"1","1",\N

$ psql -c "\copy \"ACOMPTE\" from 'data.csv' WITH (FORMAT csv, HEADER, NULL '\N')"
COPY 1

$ psql -c "select * from \"ACOMPTE\"

 ID | ID_SALARIE | MONTANT | ID_MOUVEMENT | ARCHIVE |   ORDRE    | MODIFICATION_DATE | ID_USER_COMMON_MODIFY | ID_USE
----+------------+---------+--------------+---------+------------+-------------------+-----------------------+-------
  1 |          1 |       0 |            1 |       0 | 0.00000000 |                   |                     1 |       
(1 row)

Peut-être avez-vous un problème d'échappement de vos simple ou double quote, mais dans ce cas le message d'erreur serait différent.

Hors ligne

#9 23/11/2016 17:01:12

Deun
Membre

Re : Valeur NULL pour timestamp

En fait la commande exacte est la suivante :

psql -d OpenConcerto --command='\copy \"schema50\".\"ACOMPTE\" from 'ACOMPTE.txt' WITH (FORMAT csv, HEADER, NULL '\N')'

Le problème est que j'avais omis de protéger les " par un \. Cependant il y a erreur qunad-même en plus parce que l'erreur, avec la commande ci-dessus reoturne :

\copy: error de procesamiento en «"schema50\"»

Par ailleurs en mettant des guillemets douibles pour encadrer la commande ça marche :

psql -d OpenConcerto --command="\copy \"schema50\".\"ACOMPTE\" from 'ACOMPTE.txt' WITH (FORMAT csv, HEADER, NULL '\N')"

Merci.

Dernière modification par Deun (23/11/2016 17:01:43)

Hors ligne

Pied de page des forums