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

#1 26/04/2017 11:20:01

\copy avec des boolean

Bonjour,

Je veux faire un export csc d'une db pg vers une autre db pg. Les deux dbs sont identiques. Elles sont ont créées par restore à partir d'une même backup.

Export :

\copy (select * from "tblContacts_data" where audit_id in (select audit_id from audit_history where table_name = 'tblContacts_data')) to '/home/rubin/Development/Sync/work/tblContacts_data.csv' with csv header;

Import :

\copy ariel."tblContacts_data" from './work/tblContacts_data.csv' with csv header;

j'obtiens

psql:./work/_import_modifs.sql:2: ERROR:  invalid input syntax for integer: "f"
CONTEXT:  COPY tblContacts_data, line 2, column Credit: "f"

le fichier : la valuer posant problème est entre !!!!!!!!!!!!!!!!!

Company,Alpha,ContactID,Title,FirstName,LastName,Qualifications,Address1,Address2,Address3,Town/City,County/State,PostalCode,Country,Telephone1,Mobile,Telephone2,Email1,Email2,Fax,Lead,Website,Salutation,English Salutation,ShipName,ShipAddress1,ShipAddress2,ShipAddress3,ShipTown/City,ShipCounty/State,ShipPostalCode,VatNr,EtNr,JbtNr,FinRating,TurnOver $,Memo,COD,Bank,BankAddress1,BankAddress2,BankAddress3,BankTown/City,BankCounty/State,BankPostalCode,BankCountry,AccountNr,Swift,Commission Base,!!!!!!!!!!!!!!!Credit!!!!!!!!!!!!!!,Currency,RSC-Link,ADDED,RIA_NR,ANNICK_NR,Last_Contacted,ContactCycle,UPDATED,SIMIL,KYC,ADC_NR,audit_id,deleted_by,Active,DateAdded,deleted_when

Mi corp,MIMI,16947,,Mi,Mic,prog,str1,str2,str3,Brussels,Beijing,1190,BY,0998898,00998776,,e@kkdze.bbe,,66556,JCK,,Dear Sirs,Ole,,,,,,,,,,,,,,f,,,,,,,,,,,0,0,,!!!!!!!!!!!!!!!f!!!!!!!!!!!!!!,,0,0,,60,f,,,0,8868,,f,2017-04-25,

Dans la db source, la colonne credit (integer) = 0.

Je ne comprends pas pourquoi, \copy me la transforme en f.

Je suis franchement navré de porter à votre connaissance un problème aussi horrible.

Merci pour votre attention

Hors ligne

#2 26/04/2017 11:31:09

rjuju
Administrateur

Re : \copy avec des boolean

Je ne reproduis pas votre comportement :

# create table test(id integer);
CREATE TABLE
# insert into test select 0;
INSERT 0 1
# \copy (select * from test) to '/tmp/test.csv' with csv header;
COPY 1
$ cat /tmp/test.csv
id
0

Ça ressemble quand même beaucoup à l'export d'une colonne de type bool plus que de type integer.  Peut-être que le type de la colonne a été modifié depuis la restauration sur la base source ?

Hors ligne

#3 26/04/2017 13:37:18

Re : \copy avec des boolean

Merci pour votre réponse mais, hélas, les dbs sont identiques.

Indépendamment de la db de destination,  l'export de

                                             Table "public.tblContacts_data"
       Column       |            Type             |                               Modifiers
--------------------+-----------------------------+-----------------------------------------------------------------------
... 
 Credit             | integer                     | default 0
 ...

met un f pour credit. (sa valeur dans la table est 0.)
De plus, faisant l'export et l'import avec le header, je suis sûr de la colonne qui pose problème.

Je trouve ça étrange...

Hors ligne

#4 26/04/2017 13:59:02

dverite
Membre

Re : \copy avec des boolean

La colonne Credit correspond bien à la valeur 0 dans la ligne CSV. En l'état le plus probable parait être une désynchro des colonnes. Vous pouvez montrer le résultat de \d sur la table destination dans psql?

Hors ligne

#5 26/04/2017 14:04:40

Re : \copy avec des boolean

Encore merci.

J'ai fait le \d sur les deux dbs. Les tables sont identiques (les deux db viennent du restore de la même db).

Je ne vois comment vous voyez que crédit = 0 dans la ligne csv.

Hors ligne

#6 26/04/2017 14:17:12

Re : \copy avec des boolean

Mea culpa. Credit = 0 dans le csv. J'ai importé le csv dans une feuille calc...

Hors ligne

#7 26/04/2017 14:34:55

Re : \copy avec des boolean

j'ai trouvé !

je ne pointais pas vers le bon schema...

Mille excuses

Dalibo devrait se présenter aux présidentielles

ça nous changerait des nullards habituels

bonne journée

Hors ligne

#8 26/04/2017 15:07:31

dverite
Membre

Re : \copy avec des boolean

Comment voir que telle colonne correspond à telle valeur sans importer? C'est assez facile avec les commandes Unix sed et paste.
1. faire

sed -e 's/,/\n/g'  > entete

et copier coller la ligne d'entête dans le terminal, en entrée standard. Elle va se retrouver dans le fichier entete mais au format une ligne par champ.
2. faire la même chose avec la ligne de données: 

sed -e 's/,/\n/g'  > ligne

3. faire

paste entete ligne

et ça donne ce type de résultat:

...
BankCounty/State   
BankPostalCode   
BankCountry   
AccountNr   
Swift   
Commission Base    0
!!!!!!!!!!!!!!!Credit!!!!!!!!!!!!!!    0
Currency   
RSC-Link    !!!!!!!!!!!!!!!f!!!!!!!!!!!!!!
ADDED   
RIA_NR    0
ANNICK_NR    0
Last_Contacted   
ContactCycle    60
UPDATED    f
...

Hors ligne

#9 26/04/2017 17:07:44

Re : \copy avec des boolean

génial !

vous méritez le nom que vous avez !

merci !

Hors ligne

Pied de page des forums