Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
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
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
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
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
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
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