Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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.
Julien.
https://rjuju.github.io/
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')'
Julien.
https://rjuju.github.io/
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.
Julien.
https://rjuju.github.io/
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.
Julien.
https://rjuju.github.io/
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
Pages : 1